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?
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?
The compiler knows that String is a final class and doesn't implement Cloneable. So no instance of String can ever be an instance of Cloneable. It's stopping you from thinking you've got a meaningful test when actually it will always print "false".
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 ReferenceTypeIf a cast of the RelationalExpression to the ReferenceType would be rejected as a compile-time error, then the
instanceofrelational expression likewise produces a compile-time error. In such a situation, the result of theinstanceofexpression 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 classString does not implement Cloneable(Cloneable) aStringaString instanceof Cloneable