繁体   English   中英

为什么编译器会处理List <?> 和列表 <? extends Object> 不同?

[英]Why does the compiler treat List<?> and List<? extends Object> differently?

请考虑以下代码:

import java.util.ArrayList;
import java.util.List;

public class UnboundedWildcardProblem {

    public static void main(String[] args) {
        List<?> a = new ArrayList();
        List<? extends Object> b = new ArrayList();
    }
}

List<?>的创建不会产生任何警告,但创建List<? extends Object> List<? extends Object>产生一个未经检查的警告:

Warning: java: unchecked conversion
  required: java.util.List<? extends java.lang.Object>
  found:    java.util.ArrayList

我搜索了可能的原因并找到了一些讨论:

列表<?> vs List <? extends Object>

<?>和<?之间有什么区别? 在Java Generics中扩展Object>?

但在阅读这些讨论后,在我看来List<?>List<? extends Object> List<? extends Object>是一回事。

那么,这种编译器行为的原因是什么?

编辑:

用于编译的单个标志是Xlint:unchecked标志。

List<?>的创建不会产生任何警告,但创建List<? extends Object> List<? extends Object>生成未经检查的警告

实际上,如果使用-Xlint:all或只是Xlint选项编译代码,则会收到List<?> a = new ArrayList(); 声明,如:

   warning: [rawtypes] found raw type: ArrayList
            List<?> a = new ArrayList();
                            ^
missing type arguments for generic class ArrayList<E>
where E is a type-variable:
  E extends Object declared in class ArrayList

但是,您没有获得未经检查的警告本身的原因是因为类型List<?>仅包含本节中从Java语言规范中提到的无界通配符:

从原始类或接口类型(§4.8)G到G<T1,...,Tn>形式的任何参数化类型都有未经检查的转换。

...

使用未经检查的转换会导致编译时未经检查的警告,除非所有类型参数Ti(1≤i≤n)都是无界通配符(第4.5.1节) ,或者未经检查的警告被SuppressWarnings注释(第9.6.4.5节) SuppressWarnings

但是在本节中 ,提到:

通配符? extends Object ? extends Object相当于无界通配符?

这表明编译器中存在细微的不一致。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM