Java的官方文档中写道:
需要注意的是,
List<Object>
和List<?>
不是同样。可以将Object
或Object
的任何子类型插入List<Object>
。但是您只能将null
插入到List<?>
中。
引用链接。
这似乎不是真的。这两个编译良好并且可用(例如,列表元素可以打印得很好(:
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>
——这两者都"有效"。但考虑到你不知道它是什么,如果你只是试图向这个列表中添加一个Integer对象(这是一个数字(,那么你可能正在向Doubles列表中添加Integer,这将是非法的。结论:CCD_ 18在CCD_ 19或CCD_ 20的列表中是不可能的。(除null
学术案例外(。