本系列探討 Java 泛型類型添加,本文聚焦未討論的限制之一:支援裸類型參數的 new 操作(如 new T())。Tiger/JSR-14 採用型別擦除實現泛型:僅用於型別檢查,隨即以界限替換。若 T 界限為 Object,new T() 擦除為 new Object(),顯非所望。若採用非擦除策略(每實例化一獨立類),new 操作引發更多基本語言設計決策。
為確保 new T() 合法,必須保證調用的建構子對 T 每個實例化有效。但僅知 T 為界限子型別,不知具體建構子。三種方案:
當泛型類在主體中實例化自身時發生。例:
class C<T> {
Object nest(int n) {
if (n == 0) return this;
else return new C<C<T>>().nest(n - 1);
}
}
客戶端呼叫 new C<Object>().nest(1000) 將構造 1000 層巢狀實例化 C<C<...>>。若每實例化生成獨立類,編譯期無法知悉所需類集合(數值可能來自用戶輸入)。
List<List<T>>,且因增量編譯無法完全靜態檢測)。instanceof、new,並用修改載入器解決多態遞歸。成熟執行期支援需解決許多微妙設計問題,處理不當將輕易抵消泛型優勢。期盼 Java 演進保持高表達力與健壯性。下一期將討論泛型類型最強大應用:Mixin。