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

两个类之间具有类型化容器/包含关系的Java泛型,java,generics,data-structures,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 e

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

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;}
}
泛型教程和常见问题解答似乎没有任何明显的相关内容。如何使用泛型表达这种关系


谢谢

也许是这样的:

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;
    }
}
抽象类容器<
这扩展了容器,
T扩展容器
> {
T集装箱;
保护抽象THIS();
公共T getContents(){
退回集装箱;
}
公共内容(T内容){
容器=内容;
setContainer(getThis());
}
}
类集装箱<
这扩展了Containee,
T扩展容器
> {
T形容器;
公共getContainer(){
返回容器;
}
公共容器(T容器){
this.container=容器;
}
}

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

使用普通的旧多态性会更好吗

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

class Containee
{
    Container container;
    public Container getContainer(){return container;}
    public void setContainer(Container container){this.container = container;}
}
试试这个:

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

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

class Bar extends Containee<Container<Bar>> {  
}

class Foo extends Container<Bar> {
}
类容器
{
T集装箱;
public T getContents(){return containee;}
public void setContents(T contents){containee=contents;containee.setContainer(this);}
}

类Containee您的第一个解决方案有什么问题

class Container<T extends Containee>
class Containee<T extends Container>
类容器
类集装箱

泛型最复杂的用法之一:)我对你在这个问题上少用泛型表示不满。我想我更喜欢铸造!不过还是有意思的把戏,谢谢。那要看情况了。多态性没有捕获到容器对象需要特定类型的容器。例如,如果我有
类Fish extends Containee{}类水族馆extends Container{}类沙漠extends Container{}
,您的解决方案允许我将鱼放置在沙漠中而不是水族馆中。在Tom的解决方案中,编译器阻止了这种情况。(当然,除非是未检查的强制转换)我之前问过同样的问题,简短的回答是泛型是不可能的。请看:这很好,但不是我所需要的。例如,在Bar的方法中,我希望能够编写
Foo f=this.getContainer()
,而无需强制转换。其思想是容器为containee提供API,反之亦然,两者都是特定于子类的。无论如何,谢谢你。
class Container<T extends Containee<Container<T>>>
{
   T containee;
   public T getContents(){return containee;}
   public void setContents(T contents){ containee = contents; containee.setContainer(this); }
}

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

class Bar extends Containee<Container<Bar>> {  
}

class Foo extends Container<Bar> {
}
class Baz extends Container<Bar> {
}
class Container<T extends Containee>
class Containee<T extends Container>