我正在学习Java泛型,我问自己这个问题。
这两个方法声明之间有什么区别?
public static void someMethod(List<? extends Number> numberList);
和
public static <E extends Number> void someMethod(List<E> numberList);
答案 0 :(得分:20)
在后者中,您可以引用someMethod
范围内的类型,即E
。在前者你没有。
答案 1 :(得分:9)
主要区别在于后者是泛型方法,前者不是。
因此,例如在后一种方法中,您可以执行以下操作:
public static <E extends MyObject> void someMethod(List<E> someList) {
E myObject = someList.iterator().next(); // this can actually lead to errors
myObject.doSomething(); // so treat it as an example
}
这意味着您可以替换符合泛型方法声明中规则的任意类型E
,并且能够在您的方法中使用该类型。
请注意,您应该使用类型参数调用泛型方法:
someClass.<MyArbitraryType>someMethod(someList);
您可以找到通用方法here的精彩概述。
答案 2 :(得分:5)
使用第二个版本,您可以执行以下操作:
public static <E extends Number> void someMethod(List<E> numberList) {
E number = numberList.get(0);
numberList.add(number);
}
第一个版本无法做到这一点。
答案 3 :(得分:0)
使用第一个方法声明将不允许您向列表中添加任何新内容。例如,这将无法编译。
public static void someMethod(List<? extends Number> numberList, Number number) {
numberList.add(number);
}
而第二个允许你这样做:
public static <T extends Number> void someMethod(List<T> numberList, T number) {
numberList.add(number);
}