检查下面的代码
public abstract class ClassA<ClassBType extends ClassB<ClassCType>,ClassCType extends ClassC> {
public void method(ClassBType type) {
type.myClassA = this; //Error. Type mismatch: cannot convert from TestGameMain.ClassA<ClassBType,ClassCType> to TestGameMain.ClassA<TestGameMain.ClassB<ClassCType>,ClassCType>
}
}
public abstract class ClassB<ClassCType extends ClassC> {
ClassA<ClassB<ClassCType>,ClassCType> myClassA;
private void testMethod() {
myClassA.method(this);
}
}
public abstract class ClassC {}
}
解决此问题的正确方法是什么?
编辑:我已更新上面的代码,但无法编译。
答案 0 :(得分:5)
除非我在你的问题中真的遗漏了什么,否则这就完成了工作:
ClassA<ClassB<ClassCType>, ClassCType> myClassA;
我必须更多地了解如何实例化这些动物,以了解获取ClassA的实例是否需要解决这些参数。
答案 1 :(得分:1)
您的示例过于复杂 - 即使没有ClassC
,您也可以展示相同的问题:
public abstract class ClassA<ClassBType extends ClassB> {
public void method(ClassBType type) {
type.myClassA = this;
}
}
public abstract class ClassB {
ClassA<ClassB> myClassA;
private void testMethod() {
myClassA.method(this);
}
}
问题归结为方差:ClassA<ClassB>
和ClassA<ClassBType>
之间没有继承关系(也不应该存在),因此无法进行分配。鉴于此示例的神秘性,我不确定这是否实际上是您的问题的“解决方案”,但以下代码确实编译:
public abstract class ClassA<ClassBType extends ClassB> {
public void method(ClassB type) {
type.myClassA = this;
}
}
public abstract class ClassB {
ClassA<? extends ClassB> myClassA;
private void testMethod() {
myClassA.method(this);
}
}