【问题标题】:Store null values in List<Object> and List<?>在 List<Object> 和 List<?> 中存储空值
【发布时间】:2022-01-17 02:58:15
【问题描述】:

Java 的官方文档说:

需要注意的是,List&lt;Object&gt;List&lt;?&gt; 不是 相同。您可以将ObjectObject 的任何子类型插入到 List&lt;Object&gt;。但您只能将null 插入List&lt;?&gt;

参考link

这似乎不是真的。这两个编译得很好并且可以使用(例如列表元素可以很好地打印):

List<Object> l1 = new ArrayList<>();
List<?> l2 = new ArrayList<>();
l1.add(null);
l2.add(null);

您能说一下文档中引用的句子的真正含义吗?

【问题讨论】:

  • 您不是在插入对象,而是在围绕预定义的对象集创建列表。
  • 在创建列表后尝试添加元素,例如l1.add(new Object())l2.add(new Object())。添加null 应该对两者都有效,但是将除null 之外的任何内容添加到l2 应该会让编译器抱怨。

标签: java arraylist null


【解决方案1】:

不,文字是正确的。 null 是任何类型的有效值,因此,您可以在任何列表上调用 .add(null),而不管 &lt;?&gt; 中的内容是什么。但是,null(字面意思)是唯一您可以添加到List&lt;? extends Whatever&gt; 的内容。鉴于字面意义上的.add(null) 通常是无用的,让我们忽略它,让我们简单说明:

您不能向List&lt;?&gt; 添加任何内容

这就是本文试图解释的重点。

为什么不能添加任何东西?正因为如此:

假设您有一个List&lt;? extend Number&gt;。这意味着您可以拥有List&lt;Integer&gt;List&lt;Double&gt; - 两者都“工作”。但是鉴于您不知道它是什么,如果您只是尝试将一个 Integer 对象添加到此列表(它是一个数字),那么您可能正在将一个 Integer 添加到 Doubles 列表中,这将是非法的举动.结论:.add()&lt;?&gt;&lt;? extends something&gt; 列表上是不可能的。 (null的学术案例除外)。

【讨论】:

    【解决方案2】:

    您的测试用例未涵盖以下语句:您不是在插入对象,而是在围绕预定义的对象集创建列表。

    试试类似的东西

    List<Object> l1 = new ArrayList<>();
    l1.add(null);
    l1.add("foo");
    
    List<?> l2 = new ArrayList<>();
    l2.add(null);
    l2.add("foo"); // <-- here we expect a compilation error
    

    【讨论】:

      猜你喜欢
      • 2012-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-15
      • 2019-04-06
      • 1970-01-01
      • 1970-01-01
      • 2018-12-16
      相关资源
      最近更新 更多