【问题标题】:Java - generics clarificationJava - 泛型说明
【发布时间】:2017-07-27 16:14:50
【问题描述】:

我有以下代码:

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 中的数据,我想向下转换是唯一的方法?

更新

其实这解决了错误,但不知道为什么第一个解决方案不起作用:

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

【问题讨论】:

    标签: java generics


    【解决方案1】:

    我想我明白发生了什么。

    DefaultContainerGroup 中,DC extends DefaultContainer&lt;? extends Id&gt; 表示“任何东西源自DefaultContainer”。

    ContainerGroup 中,C extends Container&lt;? extends Id, C&gt; 表示“精确 C,用作Container 的参数”。

    所以DefaultContainer 本身是可以接受的,但从它派生的类则不行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      • 2015-11-07
      • 1970-01-01
      相关资源
      最近更新 更多