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
不能推断为
整数


因此,解决方案是将原始数组更改为
整数[]
数组,并将其作为第一个参数发送给方法。

道德:不要跳到结论。道德:不要跳到结论。