過載是物件導向語言重要的特性之一,判斷過載可以根據引數列表的不同來決定是否兩個方法是否存在過載。但返回值卻不會成為判斷因素之一,這是因為函式呼叫時並沒有特徵顯示被調函式的返回值資訊,也就無法區別被呼叫的是哪個函式。
泛型擦除是指任何泛型的引數變數在編譯時,都會被擦除成object類,即list與list在編譯時都被擦除成list。假如存在兩個方法 void function(list),void function(list),按照過載定義,這兩種方法的引數列表不同,是過載的。但泛型擦除的定義又告訴我們這兩種方法是完全一樣的,屬於重定義。以下面例子為例:
public class clean
public void method(arraylista)
public static void main(string args)
}
上述**在編譯時會報錯,method method(arraylist) has the same erasure method(arraylist) as another method in type clean
這是因為泛型擦除導致方法的特徵一樣,重定義。然而下面一段**卻可以通過編譯,並執行
public class clean
public int method(arraylista)
public static void main(string args)
}
執行結果:
call method arraylist
call method arraylist
上述**與前一段**唯一的不同就是兩個方法的返回值不同,這種情況與過載的定義衝突,之所以這次能編譯和執行成功,是因為兩個mehtod()方法加入了不同的返回值後才能共存在乙個class檔案之中。class檔案方法表的資料結構時曾經提到過,方法過載要求方法具備不同的特徵簽名,返回值並不包含在方法的特徵簽名之中,所以返回值不參與過載選擇,但是在class檔案格式之中,只要描述符不是完全一致的兩個方法就可以共存。也就是說兩個方法如果有相同的名稱和特徵簽名,但返回值不同,那它們也是可以合法地共存於乙個class檔案中的。
Java泛型擦除
class person public class test else 上面的例子執行 equal這裡列印出equal的原因,list和list list擦除後的型別都是list,沒有任何區別。其實泛型的class物件都是相同的,泛型化不會改變class屬性的返回值。再看看下面的例子 private...
泛型擦除補償
由於在使用泛型的時候,將會擦除型別引數,而只保留原始型別。所以在使用泛型時,我們不能使用new t 也不能使用instanceof,因為這兩類操作要知道確切的型別。此問題的解決方案有三種 設計模式的使用 簡單工廠 最簡單 工廠方法 最靈活 模板方法 最簡捷 1.簡單工廠 在此方法中,將型別作為引數,...
泛型 泛型類 泛型方法 泛型擦除
1 是什麼?一種允許我們在不確定引數型別時候使用的型別。例如我不知道a方法應該會傳string還是int,我就用個泛型先佔坑。2 為什麼要用泛型?泛型可以在編譯期自動確定具體型別,檢查型別是否匹配,可以提高 的重用率,減少冗餘編碼。3 泛型與object的區別?像上面說的我不知道方法a的引數型別,其...