Javagenerics,未绑定的通配符 vs

我已经阅读了一些主题,这些主题涵盖了关于generics的某些问题,例如它们与原始类型的关系 。 但是我想对Java SE教程中关于未绑定generics的特定行进行补充说明。

根据一句话:

printList的目标是打印任何类型的列表,但它无法实现该目标 – 它只打印一个Object实例列表; 它不能打印List ,List ,List 等,因为它们不是List 的子类型。

如果我理解这句话; ListList之间的区别在于我们可以通过实现前者来使用类型参数ListList 。 如果我们实现后者,我们只能使用类型参数List 。 好像ListObject的上限,即List List

但是后面的句子让我感到困惑,因为根据我之前的理解, List应该只包含Object类的实例而不包含其他内容。

重要的是要注意ListList是不一样的。 您可以将Object或Object的任何子类型插入List 。 但是你只能在List插入null

这里有两个不同的问题。 事实上List可以像你说的那样接受任何对象。 List 至少可以使用Number对象,当然也可以使用任何子类,如Integer

但是这样的方法:

 public void print(List list); 

实际上只会采用一个恰好是 List 。 它不会采用任何声明为List

所以不同的是List将任何List带有任何声明,但List 只会采用声明List东西,而不是其他任何东西。

最后一个引用只是声明, List是一个列表,你实际上不知道它的项目是什么类型。 因此,除了null之外,您无法向其添加任何内容。

令您困惑的句子是试图警告您,虽然List是所有通用列表的超类型,但您无法向List集合添加任何内容。

假设您尝试了以下代码:

 private static void addObjectToList1(final List aList, final Object o ) { aList.add(o); } private static void addObjectToList2(final List aList, final Object o ) { aList.add(o); } private static  void addObjectToList3(final List aList, final T o ) { aList.add(o); } public static void main(String[] args) { List testList = new ArrayList(); String s = "Add me!"; addObjectToList1(testList, s); addObjectToList2(testList, s); addObjectToList3(testList, s); } 

addObjectToList1无法编译,因为您无法向List添加除null之外的任何内容。 (这就是句子试图告诉你的。)

addObjectToList2编译,但是在main()中对它的调用不能编译,因为List不是List的超类型。

addObjectToList3既编译又调用有效。 这是将元素添加到通用列表的方法。