请考虑以下代码:
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();
}
}
Run Code Online (Sandbox Code Playgroud)
创建List<?>不会产生任何警告,但创建List<? extends Object>会产生未经检查的警告:
Warning: java: unchecked conversion
required: java.util.List<? extends java.lang.Object>
found: java.util.ArrayList
Run Code Online (Sandbox Code Playgroud)
我搜索了可能的原因并找到了一些讨论:
列表<?> vs List <?extends Object>
<?>和<?之间有什么区别?在Java Generics中扩展Object>?
但是看完这些讨论后,在我看来,List<?>和List<? extends Object>有同样的事情.
那么,这种编译器行为的原因是什么?
编辑:
用于编译的单个标志是Xlint:unchecked标志.
创建
List<?>不会产生任何警告,但创建List<? extends Object>会产生未经检查的警告
实际上,如果使用-Xlint:allor just 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
Run Code Online (Sandbox Code Playgroud)
但是,您没有获得未经检查的警告本身的原因是因为该类型List<?>仅包含本节中从Java语言规范中提到的无界通配符:
从原始类或接口类型(§4.8)G到表单的任何参数化类型都有未经检查的转换
G<T1,...,Tn>....
使用未经检查的转换会导致编译时未经检查的警告,除非所有类型参数Ti(1≤i≤n)都是无界通配符(第4.5.1节),或者未经检查的警告被
SuppressWarnings注释(第9.6.4.5节)抑制.
但是在本节中,提到:
通配符
? extends Object等同于无界通配符?.
这表明编译器中存在细微的不一致.
| 归档时间: |
|
| 查看次数: |
1026 次 |
| 最近记录: |