gpt4 book ai didi

java - Guava Multimaps 通配符 putAll

转载 作者:行者123 更新时间:2023-12-01 18:18:32 25 4
gpt4 key购买 nike

使用 Guava 的 Multimap 解决泛型问题

class Foo{
...
private Multimap<Baz,? extends Bar> stuff;
...

public void overWriteStuff(Multimap<Baz,? extends Bar> newstuff){
this.stuff.clear();
this.stuff.putAll(newStuff);
}
}

这对我来说看起来非常简单,都是 stuff和参数 newstuff两者具有相同的类型,但我收到与泛型相关的编译器异常:

The method putAll(Multimap<? extends Baz,? extends capture#8-of ? extends Bar>) in the type
Multimap<Baz,capture#8-of ? extends Bar> is not applicable for the arguments (Multimap<Baz,capture#9-of ?
extends Bar>)

谁能看到我的泛型哪里出了问题吗?

最佳答案

问题是 ? extends Bar表示“Bar 的某些特定(但未知)子类型”。对于类中的字段或方法的参数,您不知道多重映射保存的实际类型的值。

例如,如果您有两个类 Foo extends BarBlah extends Bar ,您可以分配 Multimap<Baz, Foo>stuff并通过 Multimap<Baz, Blah>您的方法为 newstuff 。如果stuff.putAll(newstuff)被允许,那么你就会有 stuff作为一个多重映射,声称其所有值都是 Foo 的实例,而实际上其中一些是 Blah 的实例。 .

也许你实际上只是想要stuff成为Multimap<Baz, Bar> ?在这种情况下,它的值可以是任何类型的 Bar你的方法会很好用。正如 @rgettman 提到的,另一种选择是引入类型变量 T extends Bar确保 stuff 的值和newstuff都是 Bar相同子类型;您所做的取决于您实际想要完成的任务。

关于java - Guava Multimaps 通配符 putAll,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28286573/

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