instanceof - 不兼容的条件操作数类型
2022-08-31 16:45:20
以下编译正常:
Object o = new Object();
System.out.println(o instanceof Cloneable);
但事实并非如此:
String s = new String();
System.out.println(s instanceof Cloneable);
引发编译器错误。
问题出在哪里?
以下编译正常:
Object o = new Object();
System.out.println(o instanceof Cloneable);
但事实并非如此:
String s = new String();
System.out.println(s instanceof Cloneable);
引发编译器错误。
问题出在哪里?
我最近遇到的一个相关问题(在我弄清楚发生了什么之前,它把我带到了这个页面)是,Eclipse 环境可能会在“instanceof”表达式中错误地报告“不兼容的条件操作数类型”,因为缺少“instanceof”右侧类型的“import”语句。我花了一段时间试图弄清楚所讨论的类型如何可能不兼容,然后再弄清楚缺少导入导致了整个问题。希望这些信息能为某人节省一些时间。
您的问题的更明显的化身如下:
if ("foo" instanceof Number)
// "Incompatible conditional operand types String and Number"
这是在 JLS 15.20.2 类型比较运算符实例
中指定的:
RelationalExpression: RelationalExpression instanceof ReferenceType
如果将 RelationalExpression 强制转换为 ReferenceType 作为编译时错误而被拒绝,则关系表达式同样会产生编译时错误。在这种情况下,表达式的结果永远不可能是真的。
instanceof
instanceof
也就是说,由于此强制转换表达式会生成编译时错误:
(Number) "foo"
所以这个表达式必须:
("foo" instanceof Number)
您的情况有点微妙,但原理是相同的:
String
是最终类String
不实现Cloneable
(Cloneable) aString
aString instanceof Cloneable