Pregunta

La siguiente compila 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 lanza un error de compilación.

¿Cuál es el problema?

¿Fue útil?

Solución

Una encarnación más flagrante de su problema es el siguiente:

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

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

RelationalExpression:
       RelationalExpression instanceof ReferenceType
     

Si un molde de la RelationalExpression a ReferenceType sería rechazado como un error de compilación, entonces la expresión relacional instanceof asimismo produce un error en tiempo de compilación. En una situación así, el resultado de la expresión instanceof nunca podría ser verdad.

Es decir, ya que esta expresión de conversión genera un error de tiempo de compilación:

(Number) "foo"

así es necesario que 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 eso pues, no se puede hacer aString instanceof Cloneable

Otros consejos

Un tema relacionado que me he encontrado recientemente (y que me llevó a esta página, antes de que me di cuenta de lo que estaba pasando) es que el entorno Eclipse puede reportar "tipos de operando condicionales incompatibles" en una 'instanceof' expresión erróneamente debido a un estado de cuenta perdido 'importación' para el tipo a la derecha de la 'instanceof'. Pasé un tiempo tratando de encontrar la manera de los tipos en cuestión posiblemente podrían ser incompatibles antes de averiguar que una importación faltante estaba causando el problema. Espero que esta información salva a alguien algún tiempo.

El compilador sabe que String es una clase final y no implementa Cloneable. Así que ninguna instancia de cadena puede jamás ser una instancia de Cloneable. Se te impide pensar que tienes una prueba significativa cuando en realidad siempre imprimirá "falsa".

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top