Java 为什么接受接口的方法会拒绝该接口的实现?
我正试图找出教科书中某个问题的答案,但遇到了麻烦。问题是让我检查一个输入数组,看看它是否包含符合某些特性的对象。除了我试图使用实现接口的类之一的输入来实现该方法外,它的每个特性似乎都工作得很好 例如:Java 为什么接受接口的方法会拒绝该接口的实现?,java,generics,interface,Java,Generics,Interface,我正试图找出教科书中某个问题的答案,但遇到了麻烦。问题是让我检查一个输入数组,看看它是否包含符合某些特性的对象。除了我试图使用实现接口的类之一的输入来实现该方法外,它的每个特性似乎都工作得很好 例如: main(){ boolean r1 = has(input, checkFor2); } public static <T> boolean has(T[] input, Check<T> c){ // does its check algorithm and
main(){
boolean r1 = has(input, checkFor2);
}
public static <T> boolean has(T[] input, Check<T> c){
// does its check algorithm and returns a boolean
}
static public interface Check<T>{
boolean isContained(T item);
}
static public class checkFor2 implements Check<Integer>{
public boolean isContained(Integer val){
// does a check algorithm
}
}
// Other check algorithms implementing Check<T> follow as well.
main(){
布尔值r1=has(输入,检查2);
}
公共静态布尔has(T[]输入,检查c){
//执行其检查算法并返回布尔值
}
静态公共接口检查{
包含布尔值(T项);
}
静态公共类checkFor2实现检查{
包含公共布尔值(整数val){
//执行检查算法
}
}
//其他实现check的check算法也会跟进。
我得到的错误是在main方法中调用“has”时。它说:
类型main中的方法具有(T[],main.Check)
不适用于参数(int[],main.checkFor2)
它的建议是将方法中的类更改为一个特定的类,而不是接口,这违背了以这种方式编写它的目的
我在编写这段代码时是否犯了某种新手错误?这个问题实际上与您的界面无关。这与您提供的是一个基本的int数组
int[]
而不是Integer[]
数组有关
在方法中
public static <T> boolean has(T[] input, Check<T> c){
publicstaticboolean有(T[]输入,检查c){
类型T
是根据您作为参数给出的值推断出来的。在这种情况下,您给出的是int[]
和Check
。但是,类型推断失败:T
不能推断为整数
因此,解决方案是将基元数组更改为整数[]
数组,并将其作为第一个参数发送给方法。问题实际上与您的接口无关。这与您提供的基元整数数组int[]
而不是整数[]
数组有关
在方法中
public static <T> boolean has(T[] input, Check<T> c){
publicstaticboolean有(T[]输入,检查c){
类型T
是根据您作为参数给出的值推断出来的。在这种情况下,您给出的是int[]
和Check
。但是,类型推断失败:T
不能推断为整数
因此,解决方案是将原始数组更改为整数[]
数组,并将其作为第一个参数发送给方法。道德:不要跳到结论。道德:不要跳到结论。