8

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

重要的是要注意List<Object>List<?>不一样。您可以将 Object 或 Object 的任何子类型插入到List<Object>. 但是您只能将 null 插入到List<?>.

使用List<?>when onlynull可以插入有什么用?

例如,

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

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

3 回答 3

13

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

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

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

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

于 2015-03-30T09:06:52.217 回答
5

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

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

于 2015-03-30T09:04:13.523 回答
1

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

add(capture<?>)injava.util.List不能应用于(java.lang.Object)

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

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

对象的字符串数组

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

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

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

好吧,在 的情况下List<?>,Java 编译器试图通过禁止我们向 aList<?>或 a中添加值来为我们做的事情List<? extends Object>是将我们置于只能安全使用此类型的位置。事实上,唯一允许您放入 a的值List<?>是该null值,因为null可以强制转换为任何类型。

于 2021-11-07T05:35:22.420 回答