我知道我们无法调用instanceof List<E>
,因为List<E>
不是可再生类型。 instanceof List
和instanceof List<?>
都有效;但是eclipse IDE建议使用instanceof List<?>
。
我想知道为什么建议使用未绑定的通配符instanceof List<?>
而不是原始调用instanceof List
。未绑定的通配符instanceof List<?>
是否比原始调用instanceof List
有任何优势?
提前感谢。
编辑1 :实际上,instanceof List
和instanceof List<?>
与编译时编译器将擦除类型相同。但是,除了Mena指出的美容理由之外,是否有任何其他理由使用instanceof List<?>
支持instanceof List
?
编辑2 :根据Oracle的this entry:
- instanceof / cast表达式的类型为raw
醇>这种情况经常发生,因为javac禁止使用instanceof表达式 其目标类型是泛型类型;对于强制转换,编译器是 允许稍微更宽松,因为允许转换为泛型类型但是a 发出警告(见上文)。无论如何,原始类型应该被替换 由一个无界的通配符,因为他们有类似的属性w.r.t. 子类型。
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所说的美容理由和使用genenics的限制之外,instanceof List
和instanceof List<?>
是相同的。
答案 0 :(得分:3)
“List<E>
不是可再生类型”并不是制定instanceof
无法编译的最佳方式。
instanceof
运算符在运行时验证对象的类型。
因此,type erasure阻止Java了解其参数化类型(<>
之间的类型)。
因此原始List
(相当于List<Object>
)或List<?>
(即List
未知类型)在这里实际上意味着相同,尽管原始语法通常建议不要(在这里,出于美观的原因)。
答案 1 :(得分:0)
可能因为List
是原始类型而List<?>
不是。原始类型可能非常危险,因为它们可能有许多奇怪的副作用。
我会尽快发布参考资料。
答案 2 :(得分:0)
列表本身就是一种类型。因此,如果你改变它里面的类型,那就不会有任何区别。