Question

Ce qui suit compile bien:

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

Mais cela ne fait pas:

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

Une erreur du compilateur est levée.

Quel est le problème?

Était-ce utile?

La solution

Une incarnation plus flagrante de votre problème est le suivant:

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

Ceci est spécifié dans JLS 15.20.2 Type opérateur de comparaison instanceof :

RelationalExpression:
       RelationalExpression instanceof ReferenceType
     

Si un casting de RelationalExpression referenceType serait rejeté comme une erreur de compilation, l'expression relationnelle instanceof produit également une erreur de compilation. Dans une telle situation, le résultat de l'expression instanceof ne pourrait jamais être vrai.

C'est, puisque cette expression en fonte génère une erreur de compilation:

(Number) "foo"

doit cette expression:

("foo" instanceof Number)

Votre cas est un peu plus subtile, mais le principe est le même:

  • String est une classe finale
  • String ne met pas en œuvre Cloneable
  • Par conséquent, vous ne pouvez pas faire (Cloneable) aString
  • Par conséquent aussi vous ne pouvez pas faire aString instanceof Cloneable

Autres conseils

Une question connexe que je suis venu à travers récemment (et qui m'a conduit à cette page, avant de comprendre ce qui se passait) est que l'environnement Eclipse peut signaler « Incompatible types d'opérandes conditionnels » dans un « instanceof » expression par erreur en raison d'un manque déclaration « d'importation » pour le type à droite du « instanceof ». J'ai passé un certain temps à essayer de comprendre comment les types en question pourraient être incompatibles avant de déterminer qu'une importation manquante était à l'origine du problème. Espérons que cette information permet d'économiser un peu de temps quelqu'un.

Le compilateur sait que String est une classe finale et ne met pas en œuvre Cloneable. Donc, aucun cas de chaîne peut jamais est une instance de Cloneable. Il vous empêche de penser que vous avez un test significatif alors qu'en réalité, il sera toujours imprimer « false ».

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top