Vraag instanceof - incompatibele typen voorwaardelijke operand


Het volgende compileert goed:

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

Maar dit betekent niet:

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

Er is een compileerfout gegenereerd.

Wat is het probleem?


50
2018-03-31 08:10


oorsprong


antwoorden:


Een meer flagrante incarnatie van uw probleem is de volgende:

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

Dit wordt gespecificeerd in JLS 15.20.2 Type vergelijkingsoperator instanceof:

RelationalExpression:
       RelationalExpression instanceof ReferenceType

Als een cast van de RelationalExpression naar de ReferenceType zou worden verworpen als een compile-time error, then the instanceof relationele expressie produceert eveneens een compile-time error. In een dergelijke situatie is het resultaat van de instanceof uitdrukking kan nooit waar zijn.

Dat wil zeggen, omdat deze cast-expressie een compile time error genereert:

(Number) "foo"

dus moet deze uitdrukking:

("foo" instanceof Number)

Uw zaak is een beetje subtieler, maar het principe is hetzelfde:

  • String is een laatste klas
  • String implementeert niet Cloneable
  • Daarom kun je het niet doen (Cloneable) aString
  • Daarom kun je ook niet doen aString instanceof Cloneable

48
2018-03-31 09:41



Een gerelateerd probleem dat ik recentelijk tegenkwam (en dat me naar deze pagina leidde voordat ik erachter kwam wat er gaande was) is dat de Eclipse-omgeving "Incompatibele conditionele operandtypen" in een "instanceof" -expressie ten onrechte kan melden vanwege een missende 'import' verklaring voor het type rechts van de 'instanceof'. Ik heb een tijdje geprobeerd om erachter te komen hoe de typen in kwestie mogelijk incompatibel waren voordat ik erachter kwam dat een ontbrekende import het hele probleem veroorzaakte. Hopelijk bespaart deze informatie iemand tijd.


148
2018-01-04 19:10



De compiler weet dat String is een laatste klasse en implementeert niet Cloneable. Dus geen enkele instantie van String kan ooit een voorbeeld zijn van Cloneable. Het weerhoudt je ervan te denken dat je een zinvolle test hebt, terwijl het in feite altijd "false" zal afdrukken.


28
2018-03-31 08:12