簡體   English   中英

獲取與泛型類型實例化相對應的Class實例

[英]Getting a Class instance corresponding to a generic type instantiation

我有以下類型:

public class GenericClass<T> {
    public GenericClass(Class<T> cls) {}
}

但是,當T本身是泛型類時,我似乎無法稱之為:

GenericClass<List<String>> g = new GenericClass<>(???);

使用List.class無法編譯,並且List<String>.class是無效的語法。 如何獲取Class<List<String>>的實例傳遞給構造函數?

這是一個更簡單的解決方案..這完全掩蓋了丑陋。 這里的方法是隱式綁定結果類型 ,並將其與傳入的原始類分開。

public class GenericClass<T> {
    public GenericClass(Class<T> cls) {}

    // static constructor;
    //    - hides unchecked ugliness, & implicitly binds 'nicely typed' to result.
    //
    public static <T>  GenericClass<T> create (Class<? super T> clazz) {
        // ugly cast is hidden in here;  no type checking.
        Class<T> clazz_ = (Class<T>)(Class) clazz;
        return new GenericClass( clazz_);
    }
}

用法:

GenericClass<List<String>> g = GenericClass.create( List.class);

我將“通過類”的界限限制為? super T 現在是? super T ,但是-如果這太嚴格了-您可以放寬限制並使參數僅為Class<?> clazz

該解決方案已經在我的IDE中進行了測試(至少很快),並且似乎運行良好。 從長遠來看,我不確定這是否是解決您遇到的任何設計問題的最佳方法-但這絕對是解決當前問題的最簡潔的方法。

怎么樣

GenericClass<List<String>> g =
    new GenericClass<>((Class<List<String>>)(Class<?>)ArrayList.class);

您也可以嘗試如下聲明構造函數

public <E extends T> GenericClass(Class<E> cls)

然后,您可以通過構造函數傳遞List.class和List的任何子級。

暫無
暫無

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

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