Java泛型中的上限通配符

Kai*_*i.C 5 java generics exception

经过一段时间的搜索,我仍然无法找到我的问题的任何答案,即使有几个泛型相关的主题,所以在这里你去:

ArrayList<? super IOException> list = new ArrayList<Exception>();
list.add(new FileNotFoundException("this is ok."));
list.add(new IOException("This is ok"));
list.add(new ClassCastException("compile err"));//why compile err?
list.add(new Exception("compile err"));//why compile err? 
Run Code Online (Sandbox Code Playgroud)

为什么最后两行不能编译?特别是最后一行.我一直在对这个话题进行相当多的测试,但仍然无法理解逻辑.

谢谢.

Thi*_*ilo 8

ArrayList<? super IOException> 可能是以下任何一种(因为有一张外卡):

ArrayList<IOException>
ArrayList<Exception>
ArrayList<Throwable>
ArrayList<Object>
Run Code Online (Sandbox Code Playgroud)

代码需要处理所有四种可能性.

但如果它是一个ArrayList<IOException>,你不能放入一个ClassCastException或一个Exception,因此编译错误.

这是我没有得到的:为什么这个编译------ >>> list.add(new FileNotFoundException("this is ok.")); <<< ----我认为FileNotFoundException也低于IOException的界限.但它编译得很好.

不,FileNotFoundException没问题,因为它扩展了IOException,你可以把它放在所有四种类型的列表中.

请注意,由于历史原因,数组不会获得相同的严格类型检查,您可以编译以下内容(然后在运行时获取数组存储异常):

   Exception[] a = new IOException[4];
   a[0] = new FileNotFoundException("this is ok.");  
   a[1] = new IOException("This is ok");
   a[2] = new ClassCastException("compiles, but boom!");
   a[3] = new Exception("compiles, but boom!"); 
Run Code Online (Sandbox Code Playgroud)