我正在學習Java泛型,我問自己這個問題。Java通用方法聲明
這兩個方法聲明有什麼區別?
public static void someMethod(List<? extends Number> numberList);
和
public static <E extends Number> void someMethod(List<E> numberList);
我正在學習Java泛型,我問自己這個問題。Java通用方法聲明
這兩個方法聲明有什麼區別?
public static void someMethod(List<? extends Number> numberList);
和
public static <E extends Number> void someMethod(List<E> numberList);
在後者你有someMethod
,即E
的範圍內的類型的引用。在前者你不會。
使用第一個方法聲明將不允許您向列表添加任何新內容。例如,這不會編譯。
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);
}
有了你可以這樣做的第二個版本:
public static <E extends Number> void someMethod(List<E> numberList) {
E number = numberList.get(0);
numberList.add(number);
}
這是不可能的第一個版本。
主要區別在於後者是通用方法前者不是。
因此,例如,在後一種方法,你可以做這樣的事情:
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一個很好的概述。
在java Se 7及以上版本中,你可以調用這個'someClass.somemethod(someList);''我相信,沒有se7編譯器atm,請確認嗎? – ZeDonDino 2013-02-20 12:22:35
謝謝你指出。 – 2013-02-20 12:23:02
我沒有se7編譯器atm。 – 2013-02-20 12:23:50
使用第二個允許您在'someMethod's代碼中引用E. – Oren 2013-02-20 12:01:49