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,实际上它总是会打印“假”。