为什么编译?

今天早些时候,我在调试一些代码时发现像下面这样的东西没有抛出编译时exception,我吃了一惊:

public Test () { HashMap map = (HashMap) getList(); } private List getList(){ return new ArrayList(); } 

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

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

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