Java 如何使嵌套泛型类相互引用?

Java 如何使嵌套泛型类相互引用?,java,generics,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.Cla

检查下面的代码

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 {}
}
公共抽象类ClassA{
公共void方法(ClassB类型){
type.myClassA=this;//错误。类型不匹配:无法从TestGameMain.ClassA转换为TestGameMain.ClassA
}
}
公共抽象类B{
ClassA myClassA;
私有void testMethod(){
myClassA.方法(本);
}
}
公共抽象类ClassC{}
}
解决这个问题的正确方法是什么


编辑:我已经更新了上面的代码,但它不会编译。

除非我在你的问题中确实遗漏了什么,否则这就完成了工作:

ClassA<ClassB<ClassCType>, ClassCType> myClassA;
ClassA我的ClassA;

我需要了解更多有关如何实例化这些动物的信息,以了解获取ClassA实例中的参数是否是一个需要解决的问题。

除非我在您的问题中确实遗漏了一些内容,否则这项工作可以完成:

ClassA<ClassB<ClassCType>, ClassCType> myClassA;
ClassA我的ClassA;

我需要了解更多关于如何实例化这些动物的信息,以了解让ClassA实例具有这些参数是否是一个需要解决的问题。

您的示例过于复杂-即使没有
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{
公共void方法(ClassB类型){
type.myClassA=此类型;
}
}
公共抽象类B{
ClassA myClassA;
私有void testMethod(){
myClassA.方法(本);
}
}
问题归结为差异:a
ClassA
和a
ClassA
之间没有继承关系(也不应该有),因此无法进行赋值。鉴于此示例的神秘性,我不确定这是否是您问题的“解决方案”,但以下代码确实可以编译:

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);
    }
}
公共抽象类ClassA{
公共作废方法(ClassB类型){
type.myClassA=此类型;
}
}
公共抽象类B{

ClassA您的示例过于复杂-即使没有
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{
公共void方法(ClassB类型){
type.myClassA=此类型;
}
}
公共抽象类B{
ClassA myClassA;
私有void testMethod(){
myClassA.方法(本);
}
}
问题归结为差异:在
ClassA
ClassA
之间没有继承关系(也不应该有),因此无法进行赋值。鉴于此示例的神秘性质,我不确定这是否是问题的“解决方案”,但以下代码确实编译:

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);
    }
}
公共抽象类ClassA{
公共作废方法(ClassB类型){
type.myClassA=此类型;
}
}
公共抽象类B{

ClassA无论你是否能找到一种方法来实现这一点,我是否可以建议,泛型的使用非常复杂,难以维护。你需要找到一种更简单的方法。这更多的是一种思想实验,而不是有用的东西。我遇到了这个问题,Eclipse无法找到解决它的方法。我不再实际使用它。无论如果你能找到一种方法来做到这一点,我可以建议泛型的使用非常复杂,难以维护。你需要找到一种更简单的方法。这更多的是一种思想实验,而不是有用的东西。我遇到了这个问题,Eclipse找不到解决它的方法。我不再实际使用它了。这解决了最初的问题我被问到了这个问题。但是我的问题实际上更具体,涉及到上面的代码。我添加了你的代码,我还添加了一些导致问题的效果,我真的看到,这修复了问题提出的原始问题。但是我的问题实际上更具体,涉及到上面的代码。我添加了你的代码代码,我还添加了一些导致问题的效果,我真的看到简化的问题在于它隐藏了一个问题。如果ClassB本身是参数化的,那么引用使用extends可能会有问题。
ClassA@Yishai-是的,你是对的,原来的案子更加复杂,这是一个真正的解决方案因此,简化也将比我建议的更复杂。然而,我希望通过查看简化问题的解决方案,OP能够将其扩展到整个问题。问题的关键不在于
ClassC
的存在。简化的问题在于它隐藏了一个问题。如果ClassB是自参数化,引用使用扩展可能会出现问题。
ClassA@Yishai-是的,你是对的,原来的情况更加复杂,因此真正的解决方案也将比我建议的更复杂。然而,我希望通过研究简化问题的解决方案,OP能够将其扩展到整个问题。问题的关键不在于
ClassC
的存在。