多重嵌套泛型类如何相互引用?

时间:2010-02-23 23:18:02

标签: java generics

检查下面的代码

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 {}
}

解决此问题的正确方法是什么?

编辑:我已更新上面的代码,但无法编译。

2 个答案:

答案 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);
    }
}