Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

instanceof - incompatible conditional operand types

The following compiles fine:

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

But this doesn't:

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

A compiler error is thrown.

What is the problem?

like image 910
java_geek Avatar asked Mar 31 '10 08:03

java_geek


2 Answers

A related issue that I have come across recently (and which led me to this page, before I figured out what was going on) is that the Eclipse environment can report "Incompatible conditional operand types" in an 'instanceof' expression erroneously due to a missing 'import' statement for the type on the right of the 'instanceof'. I spent a while trying to figure out how the types in question could possibly be incompatible before figuring out that a missing import was causing the whole problem. Hopefully this information saves somebody some time.

like image 50
Some Guy Avatar answered Oct 07 '22 10:10

Some Guy


A more blatant incarnation of your problem is the following:

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

This is specified in JLS 15.20.2 Type comparison operator instanceof:

RelationalExpression:        RelationalExpression instanceof ReferenceType 

If a cast of the RelationalExpression to the ReferenceType would be rejected as a compile-time error, then the instanceof relational expression likewise produces a compile-time error. In such a situation, the result of the instanceof expression could never be true.

That is, since this cast expression generates a compile time error:

(Number) "foo" 

so must this expression:

("foo" instanceof Number) 

Your case is a bit more subtle, but the principle is the same:

  • String is a final class
  • String does not implement Cloneable
  • Therefore you can't do (Cloneable) aString
  • Therefore also you can't do aString instanceof Cloneable
like image 36
polygenelubricants Avatar answered Oct 07 '22 10:10

polygenelubricants