[英]Understand Type Erasure in Java
沒有類型擦除的情況下如何實現泛型 ? 據我了解,如果我有class Foo<T>
,則T
基本上被Object
取代,並且編譯器僅具有幫助它將其轉換為正確的參數化類型的元數據。
但是,如果實現了實現,則T
將是實際的參數化類型(與Object相對)...但是我不明白編譯器如何才能確定new T()
是否有效調用(即,則T可能沒有no-arg構造函數)。
具體來說,在Java中,構造函數不會被子類繼承,因此,只要無法將給定的參數化類型T
縮小為特定類型,就無法運行new T()
,因為Java是靜態類型的, 不管是否發生了改造 。 但是,使用new
實例化只是使用類的一種情況 。
對於我來說,不被刪除的泛型最明顯的用途是能夠在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.