gpt4 book ai didi

Java 泛型 : incompatible wildcard capture

转载 作者:行者123 更新时间:2023-11-30 03:52:18 24 4
gpt4 key购买 nike

我有一个使用存储实体类型参数化的存储库接口(interface)。在其中的其他方法中,我有两个感兴趣的: create()实例化实体的方法,以及 save()保存实体的方法:

public interface INamedEntityRepository<T extends INamedEntity> {
T create(String name);
void save(T namedEntity);
}
...

接下来是如何使用此界面的片段。我收到一个编译错误,指出从 create() 返回的类型然后进入save()不兼容。

INamedEntityRepository<? extends INamedEntity> repo = getEntityRepository();

INamedEntity toSave = repo.create("Named");
... // configure the entity more...
repo.save(toSave);
^

The method save(capture#7-of ? extends INamedEntity) in the type INamedEntityRepository<capture#7-of ? extends INamedEntity> is not applicable for the arguments (INamedEntity) 。我能理解这一点,因为真的INamedEntity不一定是预期的类型。

但即使这样做

repo.save(repo.create("Named")));

没有帮助:

The method save(capture#7-of ? extends INamedEntity) in the type INamedEntityRepository<capture#7-of ? extends INamedEntity> is not applicable for the arguments (capture#8-of ? extends INamedEntity) .

有什么问题吗?遇到这种情况该如何正确处理呢?提前致谢。

最佳答案

无论您是否将repo.create("Named")的结果存储在变量中,编译器都会检查其类型,并且由于create返回的类型 code> 是 INamedEntity,这是行不通的。要解决此问题,编译器必须知道 create 返回的内容是 save 可以接受的子类型,而这正是您 使用通配符。

在这种特殊情况下,您当然知道类型是正确的,因此您可以使用如下所示的不安全强制转换:

((INamedEntityRepository<INamedEntity>) repo).save(repo.create("Named"));

或者您可以将不安全操作的问题委托(delegate)给另一个位置,例如首先声明不带通配符的repo

<小时/>

如果 getEntityRepository() 实际上返回某种具体类型,而不是通配符类型,您可以使用如下内容:

void <T extends INamedEntity> test() {
INamedEntityRepository<T> repo = getEntityRepository();
T toSave = repo.create("Named");
repo.save(toSave);
}

现在我把它打出来了,看起来很明显......

关于Java 泛型 : incompatible wildcard capture,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24125439/

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