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