gpt4 book ai didi

java - 创建一个不能添加指定类型的泛型集合

转载 作者:行者123 更新时间:2023-12-02 12:22:42 26 4
gpt4 key购买 nike

我理解 PECS 概念以及为什么下面的 add() 编译和不编译:

List<? super ClassCastException> list = new ArrayList<>();
list.add(new ClassCastException()); // OK
list.add(new Exception()); // Does not compile

但是下面的内容不应该是非法的吗?为什么不? (指定我们实例化时不能添加的父类(super class)型)

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

最佳答案

我们来看看第一段代码非法的原因:

List<? super ClassCastException> list = new ArrayList<>();
list.add(new Exception()); // Does not compile

list类型为List<? super ClassCastException>即作为 ClassCastException 的父级的未知类型列表。您不能输入 Exception因为如果列表实际上是 RuntimeExcept 的列表怎么办? ? RuntimeException也是 ClassCastException 的父类不是吗? 你当然不能输入 ExceptionRuntimeException 的列表中!

但是,这是不同的:

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

您可以将什么分配给 list2list2被声明为未知类型的列表,该列表是 ClassCastException 的父级。可以分配符合条件的任何类型的列表。

“但是ClassCastException还有其他父类!”你说。嗯,是的,但是在赋值语句中,我们关心list2的原始值是多少吗?实际上是?如果list2号原本是ArrayList<RuntimeException> , 美好的。我们仍然可以分配 ArrayList<Exception> 。这里并不矛盾。看到第一段中的斜体字了吗?如果您尝试输入 Exception ,就会出现这种矛盾。在 ? super ClassCastException 的列表中。但你不能指出这个赋值语句有任何错误。

关于java - 创建一个不能添加指定类型的泛型集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45660195/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com