instanceof - 不兼容的条件操作数类型

时间:2010-03-31 08:10:12

标签: java instanceof cloneable

以下编译正常:

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

但这不是:

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

抛出编译器错误。

有什么问题?

3 个答案:

答案 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的实例。它阻止你认为你有一个有意义的测试,实际上它总是打印“假”。