以下编译正常:
Object o = new Object();
System.out.println(o instanceof Cloneable);
但这不是:
String s = new String();
System.out.println(s instanceof Cloneable);
抛出编译器错误。
有什么问题?
答案 0 :(得分:151)
我最近遇到的一个相关问题(在我弄清楚发生了什么之前导致我进入这个页面)是Eclipse环境错误地在'instanceof'表达式中报告“不兼容的条件操作数类型”由于缺少'instanceof'右侧类型的'import'语句。我花了一些时间试图找出问题中的类型可能是不兼容的,然后才发现丢失的导入导致了整个问题。希望这些信息可以节省一些时间。
答案 1 :(得分:48)
您问题的更明显的表现如下:
if ("foo" instanceof Number)
// "Incompatible conditional operand types String and Number"
这在JLS 15.20.2 Type comparison operator instanceof
中指定:
RelationalExpression: RelationalExpression instanceof ReferenceType
如果将 RelationalExpression 转换为 ReferenceType 作为编译时错误被拒绝,那么
instanceof
关系表达式同样会产生编译 - 时间错误。在这种情况下,instanceof
表达式的结果永远不会成立。
也就是说,因为这个强制转换表达式会产生编译时错误:
(Number) "foo"
这个表达必须这样:
("foo" instanceof Number)
你的情况有点微妙,但原则是一样的:
String
是最后一堂课String
未实施Cloneable
(Cloneable) aString
aString instanceof Cloneable
答案 2 :(得分:28)
编译器知道String
是最终类,并且没有实现Cloneable
。因此,没有String的实例可以永远是Cloneable
的实例。它阻止你认为你有一个有意义的测试,实际上它总是打印“假”。