Java泛型方法声明

时间:2013-02-20 11:59:23

标签: java generics

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

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

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

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

4 个答案:

答案 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);
}