繁体   English   中英

Java泛型:创建扩展Throwable的类对象集合

[英]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延伸AList<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.classNullPointerException.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM