Javagenerics,未绑定的通配符 vs
我已经阅读了一些主题,这些主题涵盖了关于generics的某些问题,例如它们与原始类型的关系 。 但是我想对Java SE教程中关于未绑定generics的特定行进行补充说明。
根据一句话:
printList的目标是打印任何类型的列表,但它无法实现该目标 – 它只打印一个Object实例列表; 它不能打印List ,List ,List 等,因为它们不是List 的子类型。
如果我理解这句话; List
和List
之间的区别在于我们可以通过实现前者来使用类型参数List
或List
。 如果我们实现后者,我们只能使用类型参数List
。 好像List
是Object
的上限,即List
List
。
但是后面的句子让我感到困惑,因为根据我之前的理解, List
应该只包含Object
类的实例而不包含其他内容。
重要的是要注意
List
和List
是不一样的。 您可以将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
addObjectToList1
无法编译,因为您无法向List>
添加除null
之外的任何内容。 (这就是句子试图告诉你的。)
addObjectToList2
编译,但是在main()
中对它的调用不能编译,因为List
不是List
的超类型。
addObjectToList3
既编译又调用有效。 这是将元素添加到通用列表的方法。