[英]Java generics: creating collections of class objects extending Throwable
为什么第一行有效,但第二行没有?
Collection<Class<? extends Throwable>> exs =
new ArrayList<Class<? extends Throwable>>() {{ add(MyOwnException.class); }};
Collection<Class<? extends Throwable>> exs = Arrays.asList(MyOwnException.class);
它是一个错误的原因是java推断出错误的类型,但你可以通过在类型化方法Arrays.asList()
的调用中指定类型来进行编译而不进行转换 :
Collection<Class<? extends Throwable>> exs
= Arrays.<Class<? extends Throwable>>asList(Exception.class); // compiles
如果不指定类型,java会将集合的元素类型推断为Class<Exception>
, 而不能将其分配给Collection<Class<? extends Throwable>>
Collection<Class<? extends Throwable>>
。
记住泛型,如果B
延伸A
, List<B>
不延伸List<A>
。
泛型非常棘手。
在这种情况下, Arrays.asList
将返回一个List<Class<MyOwnException>>
,它与List<Class<? extends Throwable>>
List<Class<? extends Throwable>>
。
他们的行为会因List<Class<? extends Throwable>>
而有所不同 List<Class<? extends Throwable>>
允许你添加扩展Throwable的对象,但List<Class<MyOwnException>>
只接受MyOwnException类型的对象。
第一行是有效的,因为Assignement( ArrayList
) 右侧元素的类型是Class<? extends Throwable>
Class<? extends Throwable>
允许添加任何Class<? extends Throwable>
Class<? extends Throwable>
object,包括MyOwnException
。 您还可以在第一行Collection
添加Exception.class
或NullPointerException.class
等。
但第二行更加严格:你有一个Collection<Class<? extends Throwable>>
Collection<Class<? extends Throwable>>
可能包含Class<Exception>
, Class<NullPointerException>
等,并且您希望放置一个Collection<Class<MyOwnException>>
,它不允许Class<Exception>
等。
推断Arrays.asList(MyOwnException.class)
具有类型List<Class<MyOwnException>>
,它与List<Class<? extends Throwable>>
不兼容List<Class<? extends Throwable>>
List<Class<? extends Throwable>>
因为类型参数不同。
如果你在第一级放一个通配符,它应该工作:
Collection<? extends Class<? extends Throwable>> exs = Arrays.asList(MyOwnException.class);
如果第二个例子工作,它将允许这样的代码:
Collection<Class<? extends Throwable>> exs = Arrays.asList(MyOwnException.class);
exs.add(IOException.class);
看到问题? Arrays.asList()
将返回List<Class<MyOwnException>>
,然后您将尝试将Class<IOException>
插入其中。 这显然是一种类型不匹配。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.