簡體   English   中英

Java通用成員初始化

[英]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.

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