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