- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
为什么这段代码会出现编译时错误?
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
,其中 T
是 Location
的子类(或者是 Location
本身)。”
现在,让我们把它放在一边一秒钟。你希望这个编译:
List<String> strings = new List<String>();
strings.add(new Object());
?我不这么认为 - 你不能将一个裸“对象”添加到字符串列表中。字符串列表中的任何项目都必须是字符串。
回到你的第一件事。假设 locationsTypeMap.get(key)
返回一个对象(逻辑上 - 现在忽略类型删除)一个 List<ExoticLocation>
- 但假设 newLocation 实际上是 BoringLocation
的一个实例.你不应该能够添加 BoringLocation
到 List<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/
我是一名优秀的程序员,十分优秀!