gpt4 book ai didi

java - 为我揭开通配符的神秘面纱

转载 作者:搜寻专家 更新时间:2023-11-01 01:30:32 25 4
gpt4 key购买 nike

为什么这段代码会出现编译时错误?

public Interface Location {
.......
}

类代码...

 Map<Type, List<? extends Location>> locationsTypeMap = new HashMap<Type, List<? extends Location>>();
/**
Code to add elements to the hashMap.
*/
newLocation = getNewLocation()
while(mapHasElements){
Location.Type key = location.getType();
List<? extends Location> valueList = (List<? extends Location>)locationsTypeMap.get(key); //1
valueList.add(newLocation);/*Compile error*/
}

另一方面,如果我用下面的行替换第 1 步

List<Location> valueList = (List<Location>)locationsTypeMap.get(key);

最佳答案

通配符“? extends Location”的意思是“对于某些 List<T>,我希望它是 T,其中 TLocation 的子类(或者是 Location 本身)。”

现在,让我们把它放在一边一秒钟。你希望这个编译:

List<String> strings = new List<String>();
strings.add(new Object());

?我不这么认为 - 你不能将一个裸“对象”添加到字符串列表中。字符串列表中的任何项目都必须是字符串。

回到你的第一件事。假设 locationsTypeMap.get(key)返回一个对象(逻辑上 - 现在忽略类型删除)一个 List<ExoticLocation> - 但假设 newLocation 实际上是 BoringLocation 的一个实例.你不应该能够添加 BoringLocationList<ExoticLocation>并且编译器知道这一点 - 所以它阻止了这种情况的发生。

任何你从 List<? extends Location> 得到的东西保证是 Location某种......但你不能添加任何东西。 super 则相反。 : 你不能保证你从 List<? super Location> 得到的任何东西将是 Location ,但您可以添加 Location

举一个非常不同的例子:一串香蕉是水果的集合吗?好吧,从某种意义上说 - 你从中得到的任何东西 都是一种水果。但它不在另一个里面,因为你不能向它添加任何旧的水果 - 如果你尝试添加一个苹果,它会掉下来:)

参见 Angelika Langer's Java Generics FAQ了解更多信息。

关于java - 为我揭开通配符的神秘面纱,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2024513/

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