实例List和Listof <! - ? - >之间的区别

时间:2015-08-05 08:51:07

标签: java generics collections type-erasure erasure

我知道我们无法调用instanceof List<E>,因为List<E>不是可再生类型。 instanceof Listinstanceof List<?>都有效;但是eclipse IDE建议使用instanceof List<?>

我想知道为什么建议使用未绑定的通配符instanceof List<?>而不是原始调用instanceof List。未绑定的通配符instanceof List<?>是否比原始调用instanceof List有任何优势?

提前感谢。

编辑1 :实际上,instanceof Listinstanceof List<?>与编译时编译器将擦除类型相同。但是,除了Mena指出的美容理由之外,是否有任何其他理由使用instanceof List<?>支持instanceof List

编辑2 :根据Oracle的this entry

  
      
  1. instanceof / cast表达式的类型为raw
  2.         

    这种情况经常发生,因为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 Listinstanceof List<?>是相同的。

3 个答案:

答案 0 :(得分:3)

List<E>不是可再生类型”并不是制定instanceof无法编译的最佳方式。

instanceof运算符在运行时验证对象的类型。

因此,type erasure阻止Java了解其参数化类型(<>之间的类型)。

因此原始List(相当于List<Object>)或List<?>(即List未知类型)在这里实际上意味着相同,尽管原始语法通常建议不要(在这里,出于美观的原因)。

答案 1 :(得分:0)

可能因为List是原始类型而List<?>不是。原始类型可能非常危险,因为它们可能有许多奇怪的副作用。

我会尽快发布参考资料。

答案 2 :(得分:0)

列表本身就是一种类型。因此,如果你改变它里面的类型,那就不会有任何区别。