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