2017-07-27 65 views
3

我已經以下代碼:爪哇 - 泛型澄清

interface Id{ 
    int getA(); 
} 
class Id1 implements Id{ 
    @Override 
    public int getA() { 
     return 0; 
    } 
} 
class Id2 implements Id{ 
    @Override 
    public int getA() { 
     return 0; 
    } 
    public int getB(){ 
     return 2; 
    } 
} 

interface Container<I extends Id, C extends Container<I,C>>{ 
    C withInt(int a); 
} 

class DefaultContainer<I extends Id> implements Container<I, DefaultContainer<I>>{ 
    @Override 
    public DefaultContainer<I> withInt(int a) { 
     return new DefaultContainer<>(); 
    } 
} 
class SpecialContainer<I extends Id> extends DefaultContainer<I>{ 
    @Override 
    public SpecialContainer<I> withInt(int a) { 
     return new SpecialContainer<>(); 
    } 
} 

interface ContainerGroup<C extends Container<? extends Id, C>>{ 
    Stream<C> getContainers(); 
} 

class DefaultContainerGroup<DC extends DefaultContainer<? extends Id>> 
     implements ContainerGroup<DC>{ 
    //Error:(36, 35) java: type argument DC is not within bounds of type-variable C 

    @Override 
    public Stream<DC> getContainers() { 
     //can return: 
     // [ DefaultContainer<Id>, DefaultContainer<Id2>, ... ] OR 
     // [ SpecialContainer<Id>, SpecialContainer<Id2>, ... ] 
     return null; 
    } 
} 

而問題是最後錯誤:(36,35)的java:類型參數DC不是類型變量C.

的界限內在容器組內,我可以存儲具有兩個類型ID的容器。我認爲沒有比這更好的方式來存儲?在運行時,我將不得不使用instanceof來測試Id1或Id2以訪問getB()getter。如果這是行爲(而不是數據),我可以在Id接口中使用通用方法,但由於這只是Id2中的數據,我認爲向下轉換隻是方法?

UPDATE

其實這解決了錯誤,但不知道爲什麼第一個解決方案不起作用:

interface ContainerGroup<C extends Container<? extends Id, ? extends Container>>{ 
    Stream<C> getContainers(); 
} 

回答

0

我想我明白這是怎麼回事。

DefaultContainerGroupDC extends DefaultContainer<? extends Id>指 「任何DefaultContainer衍生的」。

ContainerGroupC extends Container<? extends Id, C>意味着 「確切C這些會用來作爲參數傳遞給Container」。

因此DefaultContainer本身是可以接受的,但從它派生的類不是。