在 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 的学术案例除外)。