为什么接受接口的方法会拒绝该接口的实现?

时间:2016-01-24 22:44:37

标签: java generics interface

我试图找出教科书中问题的答案,但我遇到了麻烦。问题是要求我检查输入数组以查看它是否包含适合某些功能的对象。除了当我尝试使用作为实现接口的类之一的输入实现该方法时,这个的每个特性似乎都正常工作。

示例:

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方法中调用“has”时。它说:

  

main类型中的方法has(T[], main.Check<T>)不适用于参数(int[], main.checkFor2)

它的建议是将方法中的类更改为特定的类而不是以这种方式编写它的目的的接口。

我在编码时犯了一些新手错误吗?

1 个答案:

答案 0 :(得分:6)

问题实际上与您的界面无关。它与您提供原始int数组int[]而不是Integer[]数组的事实有关。

方法

public static <T> boolean has(T[] input, Check<T> c){

类型T是从您作为参数提供的内容推断出来的。在这种情况下,您将提供int[]Check<Integer>。但是,an int[] cannot be boxed to an Integer[],因此类型推断失败:T无法推断为Integer

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