0

我见过很多案例,在哪里?type 仅用于创建引用。而且我们无法添加除 null 之外的任何对象。那么,使用“?”是否仅用于创建引用?

另外,提供添加空值的选项有什么需要/用途?他们完全可以在没有 add() 方法的情况下实现,对吧?有什么理由可以选择将 null 添加到 List < 中?> ?

4

2 回答 2

2

List 是一个泛型接口,与泛型类型无关的同一个接口。因此,所有实现者都需要重新定义其中的所有方法。至于能够将 null 添加到“无界”列表中,与其说是方法问题,不如说是尊重接口的必要条件:

未绑定的泛型通配符允许将对 List(或其他泛型类)的引用传递给方法,而无需在编译时了解它将包含的特定类型。但是,仿制药的合同仍然必须得到尊重。这对读取操作没有什么大问题,因为列表中的任何内容都将始终(也)是java.lang.Object。另一方面,插入操作几乎是不可能的,因为缺少关于接受类型的信息,所以不能接受任何类型 - 例如List只能接受字符串,但Object可以是其他任何东西 - 例如数字,因此不能安全地接受。

Null可以安全地工作,因为(假设 List 接受 null 值),它将是唯一始终有效地放入列表中的值(可以将null强制转换为任何有效类型)。

编辑:因为我注意到我实际上并没有回答你的问题:是的,<?>通配符(以及扩展形式也是如此<? extends X>,并且<? super X>仅在定义引用时有效,并且不能用于通用实例化。

于 2013-05-13T07:23:59.470 回答
0

首先,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
}
于 2013-05-13T07:30:03.973 回答