Java 创建无法向其中添加指定类型的泛型集合

Java 创建无法向其中添加指定类型的泛型集合,java,generics,Java,Generics,我理解PECS的概念以及为什么下面的添加编译和不编译: List<? super ClassCastException> list = new ArrayList<>(); list.add(new ClassCastException()); // OK list.add(new Exception()); // Does not compile 但是下面的内容不应该是非法的吗?为什么不呢?指定在实例化时无法添加的超级类型 List<? super ClassC

我理解PECS的概念以及为什么下面的添加编译和不编译:

List<? super ClassCastException> list = new ArrayList<>();
list.add(new ClassCastException()); // OK
list.add(new Exception()); // Does not compile
但是下面的内容不应该是非法的吗?为什么不呢?指定在实例化时无法添加的超级类型

List<? super ClassCastException> list2 = new ArrayList<Exception>(); // Compiles
                                                          ^

让我们来分析第一段代码非法的原因:

List<? super ClassCastException> list = new ArrayList<>();
list.add(new Exception()); // Does not compile
您可以为列表2分配什么?list2声明为未知类型的列表,该列表是ClassCastException的父级。可以指定符合条件的任何类型的列表


但是ClassCastException还有其他父类!你说。是的,确实有,但是在赋值语句中,我们关心list2的原始值是什么吗?不。如果list2最初是ArrayList,则可以。我们仍然可以指定ArrayList。这里没有矛盾。见第一段斜体字?这就是当你试图在一个异常列表中添加一个异常时所发生的矛盾?超级类异常。但是,您不能指出此赋值语句的任何错误。

因为List是ListUnderstand的子类型,添加到有界列表与分配到有界引用相比。
List<? super ClassCastException> list2 = new ArrayList<Exception>();