为什么第一行有效,但第二行没有?
Collection<Class<? extends Throwable>> exs =
new ArrayList<Class<? extends Throwable>>() {{ add(MyOwnException.class); }};
Collection<Class<? extends Throwable>> exs = Arrays.asList(MyOwnException.class);
Run Code Online (Sandbox Code Playgroud)
它是一个错误的原因是java推断出错误的类型,但是你可以通过在对类型化方法的调用中指定类型来进行编译而不进行转换Arrays.asList():
Collection<Class<? extends Throwable>> exs
= Arrays.<Class<? extends Throwable>>asList(Exception.class); // compiles
Run Code Online (Sandbox Code Playgroud)
在不指定类型的情况下,java会推断出集合的元素类型Class<Exception>,这是不可分配的Collection<Class<? extends Throwable>>.
记得用仿制药,如果B延伸A,List<B>也不会延长List<A>.
泛型非常棘手。
在这种情况下Arrays.asList将返回 a List<Class<MyOwnException>>,它与 不同List<Class<? extends Throwable>>。
它们的行为会有所不同,因为该类型List<Class<? extends Throwable>>允许您添加扩展 Throwable 的对象,但List<Class<MyOwnException>>只接受 MyOwnException 类型的对象。