gpt4 book ai didi

Java - 泛型说明

转载 作者:行者123 更新时间:2023-12-03 23:13:28 27 4
gpt4 key购买 nike

我有以下代码:

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

问题是最后一个 Error:(36, 35) java: type argument DC is not within bounds of type-variable C.

在容器组中,我可以存储具有两种类型 ID 的容器。我认为没有比存储这个更好的方法了吗?在运行时,我将不得不使用 instanceof 来测试 Id1 或 Id2 以便访问 getB() getter。如果这是行为(而不是数据),我可以在 Id 接口(interface)中使用通用方法,但由于这是仅存在于 Id2 中的数据,我想向下转换是唯一的方法吗?

更新

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

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

最佳答案

我想我明白发生了什么。

DefaultContainerGroup , DC extends DefaultContainer<? extends Id>表示“DefaultContainer 派生的任何东西”。

ContainerGroup , C extends Container<? extends Id, C>表示“用作 C 参数的精确 Container”。

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

关于Java - 泛型说明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45356054/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com