我從Joshua Bloch給出的谷歌I/O益智遊戲中獲得了這個。下面的代碼Java泛型刪除方法參數
public class Glommer<T> {
String glom(Collection<?> obj){
String result = "";
for(Object o : obj){
result += o;
}
return result;
}
int glom(List<Integer> ints){
int result = 0;
for(int i : ints){
result += i;
}
return result;
}
public static void main(String args[]){
List<String> strings = Arrays.asList("1", "2", "3");
System.out.println(new Glommer().glom(strings));
}
這主要方法拋出一個異常,因爲new Glommer
是原始類型,因此在Glommer
所有的仿製藥將被刪除,所以它最終調用int glom(List<Integer> ints)
而非String glom(Collection<?> obj)
。
我的問題是,即使我叫glom()
爲new Glommer<Integer>().glom(strings)
它不應該叫int glom(List<Integer> ints)
方法,因爲由於類型擦除,這種方法實際上是int glom(List ints)
和strings
是List
不Collection
類型的?
我想說編譯器確定要執行的方法的簽名,但是在運行時使用實際對象類型選擇要執行的方法。 – tcb
@tcb我加了個例子,試試吧。 – WilQu
我明白你想說什麼,在這個例子中你是正確的,但我的話是關於一個一般情況下,你可以有一個派生類與重寫的方法。 – tcb