instanceof - 不兼容的条件操作数类型

jav*_*eek 54 java instanceof cloneable

以下编译正常:

  Object o = new Object();
  System.out.println(o instanceof Cloneable);
Run Code Online (Sandbox Code Playgroud)

但这不是:

  String s = new String();
  System.out.println(s instanceof Cloneable);
Run Code Online (Sandbox Code Playgroud)

抛出编译器错误.

问题是什么?

小智 153

我最近遇到的一个相关问题(在我弄清楚发生了什么之前让我进入了这个页面)是Eclipse环境可以错误地在'instanceof'表达式中报告"不兼容的条件操作数类型"缺少'instanceof'右侧类型的'import'语句.我花了一些时间试图找出问题中的类型可能是不兼容的,然后才发现丢失的导入导致了整个问题.希望这些信息能节省一些时间.

  • ECLIPSE用户请阅读此答案! (19认同)
  • 谢谢.你刚刚解决了我的问题.我希望eclipse将来会解决. (13认同)
  • 即使使用正确的导入(作为 `import` 声明或使用完整的类名),当我尝试执行 `if (objectInstance instanceof JSONObject)` 或 `if (objectInstance instanceof) 时,它仍然会在 Eclipse ADT (Android) 中发生JSONArray)`。正如@polygenelubricants 所提到的,如果我尝试执行诸如“JSONObject jsonObject = (JSONObject)objectInstance;”之类的转换,则会显示编译时错误:_Cannot cast from Object to JSONObject_。如果这是 Eclipse 中的错误,我应该在哪里报告它(尽管 Google 可能不再支持 Eclipse)? (2认同)

pol*_*nts 53

更明显地解决您的问题如下:

if ("foo" instanceof Number)
   // "Incompatible conditional operand types String and Number"
Run Code Online (Sandbox Code Playgroud)

这在JLS 15.20.2类型比较运算符中instanceof指定:

RelationalExpression:
       RelationalExpression instanceof ReferenceType
Run Code Online (Sandbox Code Playgroud)

如果将RelationalExpression转换为ReferenceType将作为编译时错误被拒绝,则instanceof关系表达式同样会产生编译时错误.在这种情况下,instanceof表达式的结果永远不会成立.

也就是说,因为此强制转换表达式会生成编译时错误:

(Number) "foo"
Run Code Online (Sandbox Code Playgroud)

所以这个表达必须:

("foo" instanceof Number)
Run Code Online (Sandbox Code Playgroud)

你的情况有点微妙,但原理是一样的:

  • String 是最后一堂课
  • String 没有实现 Cloneable
  • 所以你做不到 (Cloneable) aString
  • 所以你也做不到 aString instanceof Cloneable

  • 只是为了补充一点,如果你错过了你想在`instanceof`表达式中使用的类型的导入,你的IDE可能会引发这个错误*而不是抱怨缺少导入.如果您有一个有效的课程但忘记导入它,这可能会导致令人困惑的"假阳性"问题. (12认同)
  • 虽然这个答案非常有用,但它缺少下面SomeGuy提到的特殊情况,这对我和其他许多人来说都是个问题. (2认同)

Jon*_*eet 29

编译器知道这String是一个最终类并且没有实现Cloneable.因此,String的任何实例不能成为Cloneable.它阻止你认为你有一个有意义的测试,实际上它总是打印"假".