9

我知道我们不能调用instanceof List<E>,因为List<E>它不是可具体化的类型。两者兼而有之instanceof Listinstanceof List<?>但是 Eclipse IDE 建议使用instanceof List<?>.

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

预先感谢。

编辑1:实际上,instanceof Listinstanceof List<?>编译器在编译时将擦除类型相同。但是,除了 Mena 指出的美容原因之外,还有其他理由可以使用instanceof List<?>instanceof List

编辑 2:根据Oracle 的这个条目:

  1. 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 Listinstanceof List<?>相同的。

4

3 回答 3

4

List<E>不是可具体化的类型”不是阐述为什么instanceof不能编译的最佳方式。

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

因此,类型擦除会阻止 Java 知道其参数化类型( 之间的类型<>)。

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

于 2015-08-05T09:00:23.983 回答
0

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

我会尽快发布参考资料。

于 2015-08-05T08:57:53.903 回答
0

List 本身就是一种类型。因此,如果您更改其中的类型,则不会有任何区别。

于 2015-08-05T08:59:49.773 回答