将List转换为MultiKeyMap时,为什么不会出现编译错误?

Lui*_*Sep 1 java casting

我刚刚遇到一段代码,它将一个aList转换成一个MultiKeyMap调用一个带有MultiKeyMapas参数的方法的代码:

someMethod ((MultiKeyMap) myList);
Run Code Online (Sandbox Code Playgroud)

哪里myListList.

当然,它会ClassCastException在运行时抛出.为什么它没有显示编译错误或至少有一个警告"类型安全:未经检查的强制转换",因为在尝试将其Collection转换为Map?两种类型都没有任何共同之处.

Joa*_*uer 8

这不是编译错误,因为可能有一个List实现也恰好是MultiKeyMap:

public MyHybrid extends MultiKeyMap implements List {
  // implement stuff
}
Run Code Online (Sandbox Code Playgroud)

我不是说这是一个好主意,但类型系统并没有阻止它.因此编译器允许转换.

它不是未经检查的强制转换的原因是因为目标类型没有泛型类型参数(即没有MultiKeyMap<K,V>).