我有两个班级:
public abstract class MyAbstractSuperClass<A, B> {
public MyAbstractSuperClass(Class<A> a, Class<B> b) {
...
}
...
}
public class MyClass<A> extends MyAbstractSuperClass<A, MyOtherClass<A>> {
public MyClass(Class<A> a) {
super(a, MyOtherClass.class));
...
}
...
}
现在你看,子类必须调用超类的构造函数。在那一行,我得到以下错误:
The constructor MySuperClass<A, MyOtherClass<A>>(Class<A>, Class<MyOtherClass>) is undefined
Class<MyOtherClass<A>>
类型的对象?提前致谢。
答案 0 :(得分:1)
构造函数需要Class<MyOtherClass<A>>
,而不是Class<MyOtherClass>
。我认为满足编译器的唯一方法是通过一系列难看的演员:
@SuppressWarnings("unchecked")
public MyClass(Class<A> a) {
super(a, (Class<MyOtherClass<A>>)(Class<?>)MyOtherClass.class);
}
通过检查可以看到类型安全,因为原始类型MyOtherClass
的类文字与参数化MyOtherClass<A>
的类文字相同。但这并不能阻止生成未经检查的警告,可以按上述方式进行抑制,也可以忽略。
答案 1 :(得分:0)
删除MyOtherClass
定义中MyClass
的类型参数。你显然对MyClass
'身体的任何地方都不感兴趣。
public class MyClass<A> extends MyAbstractSuperClass<A, MyOtherClass> {
public MyClass(Class<A> a) {
super(a, MyOtherClass.class);
}
}
如果警告困扰您,请添加@SuppressWarnings("rawtypes")
。
答案 2 :(得分:-1)
您必须向MyClass
构造函数添加第二个参数:
public MyClass(Class<A> a, Class<MyOtherClass<A>> bClass) {
super(a, bclass));
}
@Bert F:从某种意义上讲,这确实是“推卸责任”,但它将责任推卸给能够提供相应类型的类文字的人。调用者知道类型变量A
的实际值,因此可以提供正确类型的类文字。由于删除,MyClass
无法做到这一点。