35

我正在学习 Java 泛型,我问自己这个问题。

这两个方法声明有什么区别?

public static void someMethod(List<? extends Number> numberList);

public static <E extends Number> void someMethod(List<E> numberList);
4

4 回答 4

21

在后者中,您可以引用 范围内的类型someMethod,即E. 在前者你没有。

于 2013-02-20T12:02:23.537 回答
13

主要区别在于后者是通用方法,而前者不是。

因此,例如在后一种方法中,您可以执行以下操作:

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);

你可以在这里找到泛型方法的一个很好的概述。

于 2013-02-20T12:19:08.093 回答
5

使用第二个版本,您可以执行以下操作:

public static <E extends Number> void someMethod(List<E> numberList) {
  E number = numberList.get(0); 
  numberList.add(number);
}

这在第一个版本中是不可能的。

于 2013-02-20T12:09:15.820 回答
1

使用第一个方法声明将不允许您向列表中添加任何新内容。例如,这将无法编译。

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);
}
于 2013-02-20T12:06:30.513 回答