在 List<Object> 和 List<?> 中存储空值
Store null values in List<Object> and List<?>
Java的官方文档说:
It's important to note that List<Object>
and List<?>
are not
the same. You can insert an Object
, or any subtype of Object
, into a
List<Object>
. But you can only insert null
into a List<?>
.
引用link.
这似乎不是真的。这两个编译良好并且可用(例如列表元素可以很好地打印):
List<Object> l1 = new ArrayList<>();
List<?> l2 = new ArrayList<>();
l1.add(null);
l2.add(null);
您能说说文档中引用的句子的真正含义吗?
不,文字是正确的。 null
是任何类型的有效值,因此,您可以在任何列表上调用 .add(null)
,而不管 <?>
中的内容。但是,null
(字面意思)是 唯一可以添加到 List<? extends Whatever>
的 东西。鉴于字面上的 .add(null)
通常是无用的,让我们忽略它,这让我们简单地声明:
您不能向 List<?>
添加任何内容。
这就是本文试图解释的重点。
为什么你不能添加任何东西?正因为如此:
假设您有 List<? extend Number>
。这意味着您可以有一个 List<Integer>
或一个 List<Double>
- 两者都是 'work'。但是鉴于您不知道它是什么,如果您只是尝试将 Integer 对象添加到此列表(这是一个数字),那么您可能正在将 Integer 添加到 Doubles 列表中,这将是非法移动.结论: .add()
在 <?>
或 <? extends something>
列表中是不可能的。 (null
的学术案例除外)。
Java的官方文档说:
It's important to note that
List<Object>
andList<?>
are not the same. You can insert anObject
, or any subtype ofObject
, into aList<Object>
. But you can only insertnull
into aList<?>
.
引用link.
这似乎不是真的。这两个编译良好并且可用(例如列表元素可以很好地打印):
List<Object> l1 = new ArrayList<>();
List<?> l2 = new ArrayList<>();
l1.add(null);
l2.add(null);
您能说说文档中引用的句子的真正含义吗?
不,文字是正确的。 null
是任何类型的有效值,因此,您可以在任何列表上调用 .add(null)
,而不管 <?>
中的内容。但是,null
(字面意思)是 唯一可以添加到 List<? extends Whatever>
的 东西。鉴于字面上的 .add(null)
通常是无用的,让我们忽略它,这让我们简单地声明:
您不能向 List<?>
添加任何内容。
这就是本文试图解释的重点。
为什么你不能添加任何东西?正因为如此:
假设您有 List<? extend Number>
。这意味着您可以有一个 List<Integer>
或一个 List<Double>
- 两者都是 'work'。但是鉴于您不知道它是什么,如果您只是尝试将 Integer 对象添加到此列表(这是一个数字),那么您可能正在将 Integer 添加到 Doubles 列表中,这将是非法移动.结论: .add()
在 <?>
或 <? extends something>
列表中是不可能的。 (null
的学术案例除外)。