这是一个更简单的解决方案..它完全隐藏了丑陋。这里的方法是隐式绑定结果类型——并将其与传入的原始类分开。
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);
我现在已经限制了“传入的类”clazz ? super T
,但是——如果这太严格了——你可以放宽边界并将参数设为Class<?> clazz
.
该解决方案已在我的 IDE 中进行了测试(至少很快),并且似乎运行良好。我不确定从长远来看,这是否是解决您遇到的任何设计问题的最佳方法——但它绝对是解决您当前问题的最简洁的方法。