传递Class< T>的实例的“模式”(成语) (通常到构造函数)正在使用
Class Literals as Runtime-Type Tokens,并且用于保持对另外被擦除的通用类型的运行时引用.
解决方案是首先将令牌类更改为:
Class extends T>
然后对您的泛型子类提出类似的要求,就像您对超级类的一样;让具体的类传递一个类型令牌,但可以正确键入它作为参数:
这些类编译没有转换或警告:
public abstract class Abstract> {
private final Class extends T> subClass;
protected Abstract(Class extends T> subClass) {
this.subClass = subClass;
}
}
public class NonGeneric extends Abstract {
public NonGeneric() {
super(NonGeneric.class);
}
}
public class Generic extends Abstract> {
public Generic(Class extends Generic> clazz) {
super(clazz);
}
}
最后在具体的类中,如果将用法声明为自己的类,那么它不需要任何地方的转换:
public class IntegerGeneric extends Generic {
public IntegerGeneric() {
super(IntegerGeneric.class);
}
}
我没有想到如何创建一个Generic(匿名或不匿名)实例,而不需要转换:
// can someone fill in the parameters without a cast?
new Generic(???); // typed direct instance
new Generic(???) { }; // anonymous
我不认为这是可能的,但我欢迎另外显示.