55 votes

instanceof - types d'opérandes conditionnels incompatibles

Ce qui suit se compile bien :

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

Mais ce n'est pas le cas :

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

Une erreur de compilation est déclenchée.

Quel est le problème ?

154voto

Some Guy Points 1181

Un problème connexe que j'ai rencontré récemment (et qui m'a conduit à cette page, avant que je ne comprenne ce qui se passait) est que l'environnement Eclipse peut signaler par erreur "Incompatible conditional operand types" dans une expression "instanceof" en raison d'une déclaration "import" manquante pour le type à droite de "instanceof". J'ai passé un certain temps à essayer de comprendre comment les types en question pouvaient être incompatibles avant de me rendre compte qu'une importation manquante était à l'origine du problème. J'espère que ces informations permettront à quelqu'un de gagner du temps.

54voto

polygenelubricants Points 136838

Une incarnation plus flagrante de votre problème est la suivante :

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

Ceci est spécifié dans JLS 15.20.2 Opérateur de comparaison de types instanceof :

RelationalExpression:
       RelationalExpression instanceof ReferenceType

Si une distribution de l Expression relationnelle au Type de référence serait rejetée en tant qu'erreur de compilation, alors l'option instanceof l'expression relationnelle produit également une erreur de compilation. Dans une telle situation, le résultat de l'expression instanceof l'expression ne pourrait jamais être vraie.

En effet, cette expression cast génère une erreur de compilation :

(Number) "foo"

il en va de même pour cette expression :

("foo" instanceof Number)

Votre cas est un peu plus subtil, 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, vous ne pouvez pas non plus aString instanceof Cloneable

29voto

Jon Skeet Points 692016

Le compilateur sait que String est une classe finale et n'implémente pas Cloneable . Donc aucune instance de String ne peut jamais être une instance de Cloneable . Cela vous empêche de penser que vous avez un test significatif alors qu'en réalité, il affichera toujours "false".

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X