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

Java instanceof-不兼容的条件操作数类型,java,instanceof,cloneable,Java,Instanceof,Cloneable,以下内容很好: Object o = new Object(); System.out.println(o instanceof Cloneable); 但这并不是: String s = new String(); System.out.println(s instanceof Cloneable); 将引发编译器错误 问题出在哪里?编译器知道String是最后一个类,并且没有实现可克隆性。因此,任何字符串实例都不能是Cloneable的实例。它阻止你认为你得到了一个有意义

以下内容很好:

  Object o = new Object();
  System.out.println(o instanceof Cloneable);
但这并不是:

  String s = new String();
  System.out.println(s instanceof Cloneable);
将引发编译器错误


问题出在哪里?

编译器知道
String
是最后一个类,并且没有实现
可克隆性。因此,任何字符串实例都不能是
Cloneable
的实例。它阻止你认为你得到了一个有意义的测试,而实际上它总是打印“false”。

你的问题的一个更明显的体现是:

if ("foo" instanceof Number)
   // "Incompatible conditional operand types String and Number"
具体规定如下:

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

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

(Number) "foo"
因此,这个表达必须:

("foo" instanceof Number)

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

  • String
    是最后一个类
  • String
    不实现
    Cloneable
  • 因此,您不能执行
    (可克隆)aString
  • 因此,您也不能使用Cloneable的实例

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

谢谢。你刚刚解决了我的问题。我希望eclipse将来能够修复这个问题。eclipse用户阅读了这个答案!啊,是的@Shane,我疲惫的眼睛需要向我喊叫。谢谢,我爱你@有人说你很棒!我甚至不想知道我自己是如何找到这一点的……即使使用了正确的导入(作为
导入
声明或使用完整的类名),在Eclipse ADT(Android)中,当我尝试执行
if(objectInstance instanceof JSONObject)
if(ObjectInstanceof JSONArray)
时,它仍然发生在我身上。正如@polygene所提到的,如果我尝试执行强制转换,例如
JSONObject JSONObject=(JSONObject)objectInstance显示编译时错误:无法从对象强制转换为JSONObject。如果这是Eclipse中的一个bug,我应该在哪里报告它(尽管Google可能不再支持Eclipse)?虽然这个答案非常有用,但它缺少下面某个人提到的特例,这是我和其他许多人都面临的问题。除此之外,如果您试图在
instanceof
表达式中使用的类型缺少导入,您的IDE可能会引发此错误,而不是抱怨缺少导入。如果您有一个有效的类,但忘记导入它,这可能会导致令人困惑的“假阳性”问题。如果您使用eclipse,请查看一些人的答案。是的,这就是为什么
if(s instanceof String)
很好的原因,因为它总是返回true…为什么它允许相反的结果?我的意思是,给定一个实现了另一个类的类,
X instanceof Y
将编译,即使它总是
true
。为什么不一致?@marounnaroun:请记住,如果
X
为空,
instanceof
将返回
false
。。。因此,唯一相关的时间是非空常量(基本上只是字符串)或
newfoo()
表达式。我认为在语言规范中没有特殊规则是合理的。@JonSkeet我知道,但是如果
X实现了Y
,那么
X instanceof Y
总是正确的,为什么编译器没有问题?(如果
instanceof
的结果始终为假,则这是一个问题)。@MarounMaroun:这没有意义-要么
X
是一个类,在这种情况下
X instanceof Y
不会编译,要么
X
是一个表达式,在这种情况下(上述示例除外)它的值可能为
null
,在这种情况下,结果并不总是真的。这并不是说当它总是错误的时候对编译器来说是个问题——编译器只是遵循禁止它的语言规范。
("foo" instanceof Number)