我有以下类型:
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
,但是 - 如果这太严格 - 您可以放宽限制并使参数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 的任何子项。