有著樣一種泛型的用法:
class selfbounded>{}
這就像兩面鏡子,兩個鏡子之間永遠看不到頭,selfbounded接受t作為泛型引數,t又由擁有t引數的selfbounded作為邊界限定。這就叫做迴圈泛型,為了理解這種命名,看下面一段**:
class generictype{}
class curiosrecurringgeneric extends generictype{}
這個泛型基類的用處就是可產生使用匯出類作為其引數和返回型別,還可以將匯出類(子類)作為其域型別。看下面的**:
//我們先定義乙個基類,他有乙個泛型引數t
class basicholder
t get()
void f()
}
下面我們分別用兩種方法定義子類:
一種是繼承自basicholder的原型
class subtype extends basicholder {}
public
class
crgwithbasicholder
}
這個時候程式將無法編譯,原因是**st1.set();st1.get();實際上都需要轉型,因為這個時侯st1中實際上儲存的是object
另一種是繼承自擁有subtype也就是子類的泛型引數的basicholder(基類)
class subtype extends basicholder{}
public
class
crgwithbasicholder
}
這時候**是完全沒有問題的 。這個時候再subtype中傳遞給set()的引數和get()返回的型別都是確切的subtype,在基類中使用子類的泛型型別可以很方便的在基類中用子類替代其引數,這也叫做crg:基類用匯出類代替其引數。 Java泛型擦除
class person public class test else 上面的例子執行 equal這裡列印出equal的原因,list和list list擦除後的型別都是list,沒有任何區別。其實泛型的class物件都是相同的,泛型化不會改變class屬性的返回值。再看看下面的例子 private...
java泛型 擦除的補償
1 為什麼需要補償 由於擦除,我們無法直接得到泛型引數的型別資訊。所以任何執行時需要型別資訊的操作都不能工作。例如 1 無法使用instanceof關鍵字 2 無法通過new操作建立乙個泛型引數型別的物件 3 無法建立泛型陣列 public class erase 編譯錯誤 t var new t ...
泛型擦除補償
由於在使用泛型的時候,將會擦除型別引數,而只保留原始型別。所以在使用泛型時,我們不能使用new t 也不能使用instanceof,因為這兩類操作要知道確切的型別。此問題的解決方案有三種 設計模式的使用 簡單工廠 最簡單 工廠方法 最靈活 模板方法 最簡捷 1.簡單工廠 在此方法中,將型別作為引數,...