以下编译良好:

  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 类型比较运算符 instanceof:

RelationalExpression:
       RelationalExpression instanceof ReferenceType

如果演员阵容 关系表达式参考类型 将被视为编译时错误而被拒绝,然后 instanceof 关系表达式同样会产生编译时错误。在这种情况下,结果是 instanceof 表达式永远不可能是真的。

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

(Number) "foo"

这个表达式也必须如此:

("foo" instanceof Number)

你的情况有点微妙,但原理是一样的:

  • String 是最后一堂课
  • String 不执行 Cloneable
  • 因此你不能这样做 (Cloneable) aString
  • 因此你也不能这样做 aString instanceof Cloneable

其他提示

有一个相关的问题,我最近遇到(并促使我这个页面之前,我想通了什么事情)是Eclipse环境可以用“的instanceof”表达错误地报告“不兼容的条件操作数类型”由于对的“的instanceof”右边的类型缺少“进口”的语句。我花了一段时间试图找出如何在问题的类型也可能会被搞清楚的是缺少进口是造成整个问题之前不兼容。希望这一信息可以节省某人一段时间。

在编译器知道String是一个final类和不实现Cloneable。因此,没有字符串的实例可以的曾经的是Cloneable的一个实例。它阻止你以为你已经有了一个有意义的测试时,实际上它总是会打印出“假”。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top