如果只能插入空值,List<?> 的目的是什么?

What is the purpose of List<?> if one can only insert a null value?

根据link中提供的信息,它说:

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<?>.

只能插入null,用List<?>有什么用?

例如,

methodOne(ArrayList<?> l): 我们可以将此方法用于任何类型的 ArrayList 但在该方法中我们不能向列表添加任何内容,除了 null.

l.add(null);//(valid)
l.add("A");//(invalid)

您可以从列表中获取 个元素。

List<?> 通常用作方法返回的未知类型对象列表的类型,您可以从中读取元素,而不是添加元素。

当列表(或集合)是未知类型时,您可以使用无限通配符。

如教程所述,当您想获取有关某个列表的信息时使用它,例如打印其内容,但您不知道它可能包含什么类型:

public static void printList(List<?> list) {
    for (Object elem: list)
        System.out.print(elem + " ");
    System.out.println();
}

当您想向列表中插入值时不应使用它,因为唯一允许的值是 null,因为您不知道它包含什么值..

List<?> 就完全不同了。如果我们尝试将对象添加到 List<?> 中,即使对象的类型是 Object,我们也做不到。它说,

add(capture<?>) in java.util.List cannot be applied to (java.lang.Object)

现在这似乎有点限制。如果您不能将任何值作为参数传递,这就是我所说的放入列表中的意思,那么,您可以用它做什么?

好吧,让我们看看为什么存在该限制。首先,我们知道数组是协变的。那么这意味着我们可以获取一个字符串数组并将其放入一个对象数组中。

所以在这里,如果我们获取第一个对象并将其分配给一个随机字符串,一切都会好起来的。如果我们将它分配给一个新对象,如果我们添加它,那么我们将得到一个 ArrayStoreException

Exception in thread "main" java.lang.ArrayStoreException: java.lang.Object

因为协变数组的不安全性。

嗯,在 List<?> 的情况下,Java 编译器试图通过禁止我们向 List<?> 或 [=19= 添加值来为我们做些什么] 将我们置于只能安全使用此类型的位置。事实上,唯一允许放入 List<?> 的值是 null 值,因为 null 可以强制转换为任何类型。