我刚刚遇到一段代码,将a List
强制转换为a MultiKeyMap
来调用一个以MultiKeyMap
为参数的方法:
someMethod ((MultiKeyMap) myList);
myList
是List
。
当然,它会在运行时抛出ClassCastException
。为什么在尝试将Collection
投射到Map
时,它是否显示编译错误或至少出现“类型安全:未选中投射”的警告?两种类型没有任何共同之处。
答案 0 :(得分:7)
这不是编译错误,因为可能有一个List
实现也恰好是MultiKeyMap
:
public MyHybrid extends MultiKeyMap implements List {
// implement stuff
}
我不是说这是一个好主意,但类型系统并不能阻止它。因此,编译器允许转换。
它不是未经检查的强制转换的原因是因为目标类型没有泛型类型参数(即没有MultiKeyMap<K,V>
)。