我知道我们不能调用instanceof List<E>
,因为List<E>
它不是可具体化的类型。两者兼而有之instanceof List
;instanceof List<?>
但是 Eclipse IDE 建议使用instanceof List<?>
.
我想知道为什么它建议 unbound wildcardinstanceof List<?>
而不是 raw call instanceof List
。未绑定的通配符是否instanceof List<?>
比原始调用有任何优势instanceof List
?
预先感谢。
编辑1:实际上,instanceof List
与instanceof List<?>
编译器在编译时将擦除类型相同。但是,除了 Mena 指出的美容原因之外,还有其他理由可以使用instanceof List<?>
吗instanceof List
?
编辑 2:根据Oracle 的这个条目:
- instanceof/cast 表达式的类型是 raw
这种情况经常发生,因为 javac 禁止目标类型是泛型类型的 instanceof 表达式;对于强制转换,编译器稍微宽松一些,因为允许强制转换为泛型类型,但会发出警告(见上文)。无论如何,原始类型应该被无界通配符替换,因为它们具有类似的属性 wrt 子类型。
Object o = new ArrayList<String>();
List<?> list_string = (List)o;
//same as (List<?>)o boolean b = o instanceof List; //same as o instanceof List<?>
因此,我们可以推断,除了 Mena 所说的美容原因和限制使用基因外,instanceof List
是instanceof List<?>
相同的。