Обобщения Java с типизированными отношениями контейнер / контейнер между двумя классами - PullRequest
2 голосов
/ 09 марта 2011

Я надеюсь создать несколько базовых классов, которые будут включать что-то вроде следующего* за исключением того, что компилятор жалуется на containee.setContainer(this).Я взломал пару специальных решений, которые заставят суперклассы компилироваться, но ничего, что будет работать для подклассов, например,

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

Учебник по обобщению и FAQ, кажется, неесть что-нибудь очевидное, связанное с этим.Как можно выразить такие отношения, используя дженерики?

Спасибо

Ответы [ 4 ]

2 голосов
/ 09 марта 2011

Попробуйте это:

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

Foo теперь является контейнером, принимающим объекты Bar, тогда как Bar может быть добавлен к любому контейнеру, расширяющему Контейнер, так что это также возможно:

class Baz extends Container<Bar> {
}

Baz также является контейнером для объектов Bar.

2 голосов
/ 09 марта 2011

Возможно что-то вроде:

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

(или, возможно, что-то с меньшим количеством дженериков.)

1 голос
/ 09 марта 2011

Было бы лучше с простым старым полиморфизмом?

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;}
}
0 голосов
/ 10 марта 2011

в чем проблема с вашим первым решением?

class Container<T extends Containee>
class Containee<T extends Container>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...