instanceof – 不兼容的条件操作数types

以下编译罚款:

Object o = new Object(); System.out.println(o instanceof Cloneable); 

但是这不是:

  String s = new String(); System.out.println(s instanceof Cloneable); 

编译器错误被抛出。

问题是什么?

你的问题更公然的化身是以下几点:

 if ("foo" instanceof Number) // "Incompatible conditional operand types String and Number" 

这在JLS 15.20.2中指定types比较运算符instanceof

 RelationalExpression: RelationalExpression instanceof ReferenceType 

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

也就是说,由于这个expression式会产生一个编译时错误:

 (Number) "foo" 

所以这个expression:

 ("foo" instanceof Number) 

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

  • String是最后一个类
  • String不实现可Cloneable
  • 因此你不能这样做(Cloneable) aString
  • 所以也不能做aString instanceof Cloneable

我最近遇到的一个相关问题(在我弄清楚发生了什么之前,导致我到了这个页面),是因为Eclipse环境可能会错误地在“instanceof”expression式中报告“不兼容的条件操作数types”缺less“instanceof”右侧types的“import”语句。 我花了一段时间试图弄清楚,在确定缺lessimport是否导致整个问题之前,所讨论的types可能是不相容的。 希望这个信息可以节省一些时间。

编译器知道String是最后一个类,不能实现Cloneable 。 所以没有一个string的实例可以永远是一个Cloneable的实例。 它阻止了你认为你有一个有意义的testing,实际上它总是会打印“假”。