Java 泛型在两个类之间具有类型化容器/包含关系

标签 java generics data-structures

我希望生成一些基类,其中包括如下内容

class Container<T extends Containee>
{
     T containee;
     public T getContents(){return containee;}
     public void setContents(T contents){ containee = contents; containee.setContainer(this); }
}

class Containee<T extends Container>
{
     T container;
     public T getContainer(){return container;}
     public void setContainer(T container){this.container = container;}
}

这里存在一个循环定义问题,我认为可以使用通配符来缓解

class Container<T extends Containee<?>>
class Containee<T extends Container<?>>

除了编译器提示containee.setContainer(this)。我已经破解了几个临时解决方案,可以编译父类(super class),但没有任何解决方案适用于子类,例如

class Foo extends Container<Bar>
class Bar extends Containee<Foo> 

泛型教程和常见问题解答似乎没有任何与此相关的明显内容。如何使用泛型来表达这种关系?

谢谢

最佳答案

也许是这样的:

abstract class Container<
    THIS extends Container<THIS, T>,
    T extends Containee<T, THIS>
> {
    T containee;

    protected abstract THIS getThis();

    public T getContents() {
        return containee;
    }
    public void setContents(T contents){
        containee = contents;
        containee.setContainer(getThis());
    }
}

class Containee<
    THIS extends Containee<THIS, T>,
    T extends Container<T, THIS>
> {
    T container;
    public T getContainer() {
        return container;
    }
    public void setContainer(T container) {
        this.container = container;
    }
}

(或者可能是泛型较少的东西。)

关于Java 泛型在两个类之间具有类型化容器/包含关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5246826/

相关文章:

c# - 使用 Linq 比较两个通用列表

c++ - 如何查看存储在 QMap 中的数据?

Java 8 可选用法

java - 我想将 JList 选定的项目附加到 Jtextfield

java - 如何修复 MockitoExtension.class 未解决错误

generics - 向 VB.NET 中的通用列表的 FindAll 添加参数

java - 在 Java 中解压缩 GZip 字符串

c# - 如何将 LinqToSql Table<TEntity> 转换为 Table<IEntity> where TEntity : IEntity?

algorithm - 补图算法中的最短路径

google-maps-api-3 - 具有两个主键的数据结构? (缓存纬度/经度地址对)