为什么会编译?

2022-09-02 19:40:47

今天早些时候,在调试一些代码时,我大吃一惊,发现如下所示的内容不会引发编译时异常:

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

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

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


答案 1

因为可以想象返回一个子类,其中也实现了。不太可能,是的,但有可能,因此是可以编译的。getList()HashMapList


答案 2

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