为什么编译?

akf*_*akf 18 java casting exception

今天早些时候,当我调试一些代码时发现像下面这样的东西没有引发编译时异常时我感到吃惊:

 public Test () { 
     HashMap map = (HashMap) getList(); 
 }

 private List getList(){
     return new ArrayList();
 }
Run Code Online (Sandbox Code Playgroud)

你可以想象,a ClassCastException在运行时被抛出,但有人可以解释为什么在编译时List将a 转换为a HashMap是合法的吗?

ska*_*man 29

因为可以想象getList()可能会返回一个HashMap也实现的子类List.不太可能,是的,但可能,因此可编译.

  • +1:显式转换基本上是程序员告诉编译器的情况"我知道我在做什么,所以按照我的方式做" - 如果编译器不知道你真的错了,它会走你的路.嗯,这是向我解释的一种方式. (9认同)
  • 是的,如果用`ArrayList`替换`List`,编译器应该抱怨. (3认同)

dev*_*ity 17

一方面List是一个接口.没有理由不存在HashMap的子类,它也实现了List接口.在这种情况下,它将是完全有效的.