为什么编译?

时间:2009-09-29 22:35:15

标签: java exception casting

今天早些时候,我在调试一些代码时发现类似下面的内容并没有引发编译时异常,我吃了一惊:

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

 private List getList(){
     return new ArrayList();
 }

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

2 个答案:

答案 0 :(得分:29)

因为可以想象getList()可以返回HashMap的子类,它也实现了List。不太可能,是的,但可能,因此可编辑。

答案 1 :(得分:17)

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