簡體   English   中英

了解Java中的類型清除

[英]Understand Type Erasure in Java

沒有類型擦除的情況下如何實現泛型 據我了解,如果我有class Foo<T> ,則T基本上被Object取代,並且編譯器僅具有幫助它將其轉換為正確的參數化類型的元數據。

但是,如果實現了實現,則T將是實際的參數化類型(與Object相對)...但是我不明白編譯器如何才能確定new T()是否有效調用(即,則T可能沒有no-arg構造函數)。

具體來說,在Java中,構造函數不會被子類繼承,因此,只要無法將給定的參數化類型T縮小為特定類型,就無法運行new T() ,因為Java是靜態類型的, 不管是否發生了改造 但是,使用new實例化只是使用類的一種情況

INSTANCEOF

對於我來說,不被刪除的泛型最明顯的用途是能夠在instanceof表達式中使用T

class Box<T> {
   public boolean isInst(Object obj) {
      return obj instanceof T;
   }
}

還有一個想法,就是查看T是其他類的超類還是子類,或者檢查類的相等性。

靜態方法

借助這種技術,Java可以“正確”調用T上的static方法。 假設我們有以下課程:

class Parent {
   void doSomething() { System.out.println("Parent"); }
}

class Child extends Parent {
   void doSomething() { System.out.println("Child"); }
}

定義好這些之后,下面的代碼...

class Box<T extends Parent> {

   void test() { T.doSomething(); }

   public static void main(String...args) {
      Box<Parent> parentBox = new Box<>();
      Box<Child> childBox = new Box<>();

      parentBox.test();
      childBox.test();
   }
}

...應打印:

Parent
Child

但改為打印:

Parent
Parent

這是因為T通過擦除變成了Parent

遺產

通用繼承(聽起來很奇怪)可能(可能)存在:

public class GenericType<T> {
   public class Inner extends T {   }

   public static void main(String...args) {
      GenericType<MyClass>.Inner obj = new GenericType<MyClass>().new Inner();
      System.out.println(obj instanceof MyClass); // Prints true
   }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM