我正在学习 Java 泛型,我问自己这个问题。
这两个方法声明有什么区别?
public static void someMethod(List<? extends Number> numberList);
和
public static <E extends Number> void someMethod(List<E> numberList);
在后者中,您可以引用 范围内的类型someMethod
,即E
. 在前者你没有。
主要区别在于后者是通用方法,而前者不是。
因此,例如在后一种方法中,您可以执行以下操作:
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);
你可以在这里找到泛型方法的一个很好的概述。
使用第二个版本,您可以执行以下操作:
public static <E extends Number> void someMethod(List<E> numberList) {
E number = numberList.get(0);
numberList.add(number);
}
这在第一个版本中是不可能的。
使用第一个方法声明将不允许您向列表中添加任何新内容。例如,这将无法编译。
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);
}