Bohemian..
11
传递Class(通常是构造函数)实例的"模式"(惯用法)是使用类文字作为运行时类型标记,并用于保持对泛型类型的运行时引用,否则将被擦除.
解决方案首先是将绑定的令牌类更改为:
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
我不认为这是可能的,但我欢迎以其他方式表现出来.