[英]Java generic member initialization
假設我有一個參數化的Java類,其中包含一個私有的T _member。 我想寫一個默認的構造函數(沒有參數),它以某種方式將我的T _member初始化為一些已知的類型T特定值(對於Integer為-1,對於Float為Float.MAX_VALUE ......)。 那可能嗎? 我嘗試了新的T(),但編譯器不喜歡這樣。 或者我什么都不做,保證為我調用默認構造函數?
由於類型擦除 ,在運行時“沒有T”。
解決它的方法是將Class<T>
的實例傳遞給構造函數,如下所示:
public class MyClass<T> {
T _member;
public MyClass(Class<T> clazz) {
_member = clazz.newInstance(); // catch or throw exceptions etc
}
}
順便說一下,這是一個非常常見的代碼模式來解決“用T做事”的問題
它不是直接可能的,因為沒有辦法保證T
甚至有一個默認的構造函數。 但是,你可以想象使用newInstance
反射來做到這一點。 請務必捕獲可能引發的任何異常。
public class MyClass<T> {
private T _member;
public MyClass(Class<T> cls) {
try {
_member = cls.newInstance();
} catch (InstantiationException e) {
// There is no valid no-args constructor.
}
}
}
沒有初始化表達式的Java中的每個字段都會自動初始化為已知的默認值。 是的,在這種情況下,它是類型T的已知值 - null
。
事實上, 有一種方法可以做到這一點,這里有一個鏈接, 回答有關問題的SO。
因此,事實上你的主要問題是否有可能在運行時獲得通用成員類? 是的,有 - 使用反射。
大約一年前,當我回答這個問題時,我對它進行了測試並對反射進行了一些調查。 事實上,有幾種情況它不能正常工作(具有繼承的案件),但總的來說,聲稱這是不可能的是錯誤的。
但是,我強烈建議不要這樣做。
編輯。 令人驚訝的是,我在下面的答案中找到了我自己的評論:)在下一篇評論中,作者將鏈接到關於泛型反思的原始文章。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.