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);

引发编译器错误。

问题出在哪里?


答案 1

我最近遇到的一个相关问题(在我弄清楚发生了什么之前,它把我带到了这个页面)是,Eclipse 环境可能会在“instanceof”表达式中错误地报告“不兼容的条件操作数类型”,因为缺少“instanceof”右侧类型的“import”语句。我花了一段时间试图弄清楚所讨论的类型如何可能不兼容,然后再弄清楚缺少导入导致了整个问题。希望这些信息能为某人节省一些时间。


答案 2

您的问题的更明显的化身如下:

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

这是在 JLS 15.20.2 类型比较运算符实例中指定的:

RelationalExpression:
       RelationalExpression instanceof ReferenceType

如果将 RelationalExpression 强制转换为 ReferenceType 作为编译时错误而被拒绝,则关系表达式同样会产生编译时错误。在这种情况下,表达式的结果永远不可能是真的。instanceofinstanceof

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

(Number) "foo"

所以这个表达式必须:

("foo" instanceof Number)

您的情况有点微妙,但原理是相同的:

  • String是最终类
  • String不实现Cloneable
  • 因此你不能做(Cloneable) aString
  • 因此,您也无法做到aString instanceof Cloneable