无界通配符类型是否仅用于创建引用?

时间:2013-05-13 07:13:24

标签: java generics

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

另外,给出添加null选项的需要/用途是什么?他们可以简单地实现没有add()方法,对吧?任何给出在List<中添加null的选项的原因? > ?

2 个答案:

答案 0 :(得分:2)

List是一个通用的接口,并且无论泛型类型如何都是相同的接口。因此,所有实现者都需要重新定义其中的所有方法。至于能够将null添加到“无界”列表中,它不像方法那样需要尊重接口:

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

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

编辑:因为我注意到我实际上没有回答您的问题:是的,<?>通配符(以及扩展表单<? extends X>和{{1仅在定义引用时有效,并且不能在泛型实例化中使用。

答案 1 :(得分:0)

首先,null是所有类型的成员。这是在泛型之前的语言规范的一部分,所以你可以“做任何事情。”

至于?的使用,你不能*实例化*一个通配符类型的泛型类,你不能这样做:

List<? extends Number> list = new ArrayList<? extends Number>();  // error

因为它没有意义。通配符类型用于告诉编译器“我不知道列表的类型是什么,但它将受Number”限制。但是,当代码执行时,具有由Number限定的类型的List将被分配给变量。

通配符通常被视为参数:

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
}