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