2013-02-20 95 views
28

我正在学习Java泛型,我问自己这个问题。Java通用方法声明

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

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

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

使用第二个允许您在'someMethod's代码中引用E. – Oren 2013-02-20 12:01:49

回答

19

在后者你有someMethod,即E的范围内的类型的引用。在前者你不会。

0

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

public static void someMethod(List<? extends Number> numberList, Number number) { 
    numberList.add(number); 
} 

而第二个可以让你做到这一点:

public <T extends Number> static void someMethod(List<T> numberList, T number) { 
    numberList.add(number); 
} 
+0

使用第二种不会。 – ZeDonDino 2013-02-20 12:08:35

+0

只要要添加的元素是E类型或子类,就可以将元素添加到列表中。 – 2013-02-20 12:09:37

+0

我正在使用java SE 6并且不可能。 – ZeDonDino 2013-02-20 12:11:04

3

有了你可以这样做的第二个版本:

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

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

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一个很好的概述。

+1

在java Se 7及以上版本中,你可以调用这个'someClass.somemethod(someList);''我相信,没有se7编译器atm,请确认吗? – ZeDonDino 2013-02-20 12:22:35

+0

谢谢你指出。 – 2013-02-20 12:23:02

+1

我没有se7编译器atm。 – 2013-02-20 12:23:50