Java泛型方法头

Java泛型方法头,java,arrays,generics,Java,Arrays,Generics,假设我有一些方法头 public static <E> void myMethodName(E[], Comparator<E> comparator). publicstaticvoidmymethodname(E[],Comparator-Comparator)。 为什么尝试调用时会出现类型错误: myMethodName(int[], new Comparator<Integer>() { public int compar

假设我有一些方法头

public static <E> void myMethodName(E[], Comparator<E> comparator).
publicstaticvoidmymethodname(E[],Comparator-Comparator)。
为什么尝试调用时会出现类型错误:

myMethodName(int[], 
    new Comparator<Integer>() {
        public int compare(Integer e1, Integer e2) { return e1 - e2; }
    }
);
myMethodName(int[],
新比较器(){
公共整数比较(整数e1,整数e2){返回e1-e2;}
}
);

有什么想法吗?

尽管自动装箱会混淆问题,但int和Integer不是同一类型。

首先,让我们看几件事

  • 您有一个需要泛型类型的泛型方法(虽然它缺少一个变量,但我忽略了这一点)。Java根据数组的类型为
    int
    ,推断该方法的类型绑定到
    Integer

  • 您有一个原语
    int[]
    ,作为第一个参数提供。在正式签名中,它的类型绑定为
    整数

这里的问题是:一个
int[]
并不等同于一个
整数[]
。它们是两个完全不同的对象(因为它们都是数组,而不是可以自动装箱的对象)


避免此问题的正确方法是使用
整数[]
。但是,您放置在数组中的元素将根据自动装箱和转换规则自动装箱。

@user2574476:您可以将
E
指向任何引用类型,而不是原始类型。
因此,您应该使用整数[],而不是int[],因为
int
不是
Integer
。此外,您不能将原语用作泛型类型。所以在所有泛型的情况下,我都需要包装基元数组?所以。。。视情况而定。在这里您必须这样做,因为您要推断类型并将其用于数组类型和泛型类型。然而,拥有
比较器是完全合法的。是的,数组是特殊的:)它们是保存基本体而不是作为基本体的对象。自动装箱提供了一种在
int
Integer
之间架起桥梁的方法。这就是问题所在。这是个邪恶的弱智。如果你能解释为什么会这样,我很乐意听你解释。