2011-03-09 57 views
2
之間鍵入的容器/包含關係

我希望能產生一些基類,其中將包括類似如下的Java泛型有兩類

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)。我已經破解了一些特殊的解決方案,可以讓超類進行編譯,但沒有任何方法可以用於子類,例如

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

仿製藥教程和常見問題似乎沒有任何明顯的與此有關。如何用泛型表達這種關係?

感謝

+1

我問同樣的問題前,簡單的答案是它不可能與泛型看到:http://stackoverflow.com/questions/2567595/creating-circular-generic-references – 2011-03-09 16:23:12

回答

2

也許是這樣的:

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

(或者也許什麼用更少的泛型)

+0

其中最複雜的使用泛型.. :)我在這個問題上與你一起討論泛型。 – 2011-03-09 14:16:19

+0

我想我寧願投!有趣的技巧,謝謝。 – thekindamzkyoulike 2011-03-09 18:59:05

1

這會是更好地與普通的舊多態性?

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

這取決於。多態性並沒有捕捉到Containee需要一個特定類型的容器。例如,如果我有'class Fish extends Containee {} class Aquarium extends Container {} class Desert extends Container {}',您的解決方案允許我在沙漠中放置一條魚,而不是一個水族館。在Tom的解決方案中,編譯器阻止了這一點。 (當然,除了不加限制的演員陣容) – meriton 2011-03-09 14:25:20

+0

好點,沒有想到這一點。 – Dunnie 2011-03-10 14:20:24

2

嘗試這種情況:

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

Baz也是Bar對象的容器。

+0

這很好,但不是我所需要的。例如,在Bar的方法中,我希望能夠在不投射的情況下編寫'Foo f = this.getContainer()'。這個想法是容器爲容器提供了一個API,反之亦然,這兩者都是子類特定的。不管怎麼說,還是要謝謝你。 – thekindamzkyoulike 2011-03-09 18:48:20

0

您的第一個解決方案有什麼問題?

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