2013-02-20 90 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