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
之间架起桥梁的方法。这就是问题所在。这是个邪恶的弱智。如果你能解释为什么会这样,我很乐意听你解释。