instanceof – tipos de operandos condicionales incompatibles

Lo siguiente comstack bien:

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

Pero esto no:

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

Se genera un error de comstackción.

¿Cuál es el problema?

Una encarnación más evidente de su problema es la siguiente:

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

Esto se especifica en JLS 15.20.2 instanceof operador de comparación de tipo :

 RelationalExpression: RelationalExpression instanceof ReferenceType 

Si un molde de RelationalExpression para el ReferenceType se rechazaría como un error en tiempo de comstackción, la instanceof expresión relacional también produce un error en tiempo de comstackción. En tal situación, el resultado de la instanceof expresión nunca podría ser cierto.

Es decir, dado que esta expresión de conversión genera un error de tiempo de comstackción:

 (Number) "foo" 

así debe esta expresión:

 ("foo" instanceof Number) 

Su caso es un poco más sutil, pero el principio es el mismo:

  • String es una clase final
  • String no implementa Cloneable
  • Por lo tanto, no se puede hacer (Cloneable) aString
  • Por lo tanto, tampoco puede hacer una aString instanceof Cloneable

Un problema relacionado que me he encontrado recientemente (y que me llevó a esta página, antes de descubrir lo que estaba pasando) es que el entorno Eclipse puede informar “tipos de operando condicionales incompatibles” en una expresión ‘instancia de’ erróneamente debido a un Falta la statement de ‘importación’ para el tipo a la derecha de la ‘instancia de’. Pasé un tiempo tratando de descubrir cómo los tipos en cuestión podrían ser incompatibles antes de descubrir que una importación faltante estaba causando todo el problema. Con suerte, esta información le ahorrará a alguien algo de tiempo.

El comstackdor sabe que String es una clase final y no implementa Cloneable . Por lo tanto, ninguna instancia de String puede ser una instancia de Cloneable . Te está impidiendo pensar que tienes una prueba significativa cuando en realidad siempre imprimirá “falso”.

    Intereting Posts