我见过很多案例,在哪里?type 仅用于创建引用。而且我们无法添加除 null 之外的任何对象。那么,使用“?”是否仅用于创建引用?
另外,提供添加空值的选项有什么需要/用途?他们完全可以在没有 add() 方法的情况下实现,对吧?有什么理由可以选择将 null 添加到 List < 中?> ?
List 是一个泛型接口,与泛型类型无关的同一个接口。因此,所有实现者都需要重新定义其中的所有方法。至于能够将 null 添加到“无界”列表中,与其说是方法问题,不如说是尊重接口的必要条件:
未绑定的泛型通配符允许将对 List(或其他泛型类)的引用传递给方法,而无需在编译时了解它将包含的特定类型。但是,仿制药的合同仍然必须得到尊重。这对读取操作没有什么大问题,因为列表中的任何内容都将始终(也)是java.lang.Object。另一方面,插入操作几乎是不可能的,因为缺少关于接受类型的信息,所以不能接受任何类型 - 例如List只能接受字符串,但Object可以是其他任何东西 - 例如数字,因此不能安全地接受。
Null可以安全地工作,因为(假设 List 接受 null 值),它将是唯一始终有效地放入列表中的值(可以将null强制转换为任何有效类型)。
编辑:因为我注意到我实际上并没有回答你的问题:是的,<?>
通配符(以及扩展形式也是如此<? extends X>
,并且<? super X>
仅在定义引用时有效,并且不能用于通用实例化。
首先,null
是所有类型的成员。这是泛型之前的语言规范的一部分,所以你可以做任何事情。
至于使用?
,你不能*实例化*通配符类型的泛型类,你不能这样做:
List<? extends Number> list = new ArrayList<? extends Number>(); // error
因为它没有意义。通配符类型用于告诉编译器“我不知道列表的类型是什么,但它会以Number
”为界。但是,当代码执行时,类型为 by 的 ListNumber
将被分配给变量。
通配符最常被视为参数:
public static void doSeomthing(List<? extends Number> list) {
// use the list knowing only that the elements are a subclass of Number
// but knowing which exact class they are
}