泛型擦除補償

2021-12-29 23:27:49 字數 1969 閱讀 8015

由於在使用泛型的時候,將會擦除型別引數,而只保留原始型別。所以在使用泛型時,我們不能使用new t(),也不能使用instanceof, 因為這兩類操作要知道確切的型別。此問題的解決方案有三種(設計模式的使用):簡單工廠(最簡單),工廠方法(最靈活),模板方法(最簡捷)。

1.簡單工廠

在此方法中,將型別作為引數,以乙個萬能的工廠類(其中有乙個返回具體型別類的例項的泛型方法)用類的newinstance()方法返回引數化型別的例項,如下所示:

優點:簡單,直接使用泛型方法

缺點:(1)單一使用class物件的newinstance()方法只能使用預設的構造器,使得物件的建立有限制。

(2)若乙個具體的類無缺省的構造器,則會丟擲異常。

2.工廠方法

與簡單工廠方法相比,工廠方法加入了如下幾個元素:

(1)工廠介面/抽象介面—具體工廠公共的介面/型別

(2)具體工廠—–由具體工廠負責具體產品的建立,且其必須保證產品的成功的建立,在具體工廠中可呼叫各種各樣的構造方法,因為具體工廠中已將引數化型別具體化。

(3)工廠管理類——由此類可負責何種型別具體工廠的建立並可返回具體工廠的例項。

優點:加入了上述三個元素後,解決了以下問題:

1)所有的具體工廠擁有共同的介面

2)具體工廠保證了具體產品的成功建立:可呼叫任意的構造方法生成具體類的例項

3)工廠管理類:對具體工廠的生成擁有控制權,使具體工廠的生成具有了靈活性。

工廠方法的實現如下:

1)抽象工廠

2)autho***ctory:負責author例項的建立

3)intege***ctory:負責integer例項的建立

3)intege***ctory:負責integer例項的建立

3)工廠管理類(泛型類):factorymanage

4)測試客戶端

補充:具體的author類

3.模板方法

以更加簡捷的方法生成具體類的例項。與工廠方法不同的地方在於:用模板類(抽象類)來控制整個例項化過程的流程(有點像工廠管理類,由模板方法控制整體流程,而具體建立過程由其子類實現),而由具體類來完成具體產品的構建。但在具體生成類的例項時,我還是用到了工廠的概念,但其只作為乙個具體的實現而已。最大的優點:簡捷,因為直接呼叫具體的生成類即可,並且模板類是隱藏的,對客戶透明的(而工廠方法中管理類工廠要顯式地生成)。

3.1模板類

3.2具體模板類authorcreator

3.3具體模板類:integercreator

3.4客戶端測試

java泛型 擦除的補償

1 為什麼需要補償 由於擦除,我們無法直接得到泛型引數的型別資訊。所以任何執行時需要型別資訊的操作都不能工作。例如 1 無法使用instanceof關鍵字 2 無法通過new操作建立乙個泛型引數型別的物件 3 無法建立泛型陣列 public class erase 編譯錯誤 t var new t ...

Java泛型擦除

class person public class test else 上面的例子執行 equal這裡列印出equal的原因,list和list list擦除後的型別都是list,沒有任何區別。其實泛型的class物件都是相同的,泛型化不會改變class屬性的返回值。再看看下面的例子 private...

泛型 泛型類 泛型方法 泛型擦除

1 是什麼?一種允許我們在不確定引數型別時候使用的型別。例如我不知道a方法應該會傳string還是int,我就用個泛型先佔坑。2 為什麼要用泛型?泛型可以在編譯期自動確定具體型別,檢查型別是否匹配,可以提高 的重用率,減少冗餘編碼。3 泛型與object的區別?像上面說的我不知道方法a的引數型別,其...