Pergunta

Os seguintes compilam bem:

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

Mas isso não é:

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

Um erro do compilador é lançado.

Qual é o problema?

Foi útil?

Solução

Uma encarnação mais flagrante do seu problema é o seguinte:

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

Isso é especificado em JLS 15.20.2 Operador de comparação de tipo instanceof:

RelationalExpression:
       RelationalExpression instanceof ReferenceType

Se um elenco do RelationalExpression para o Tipo de referência seria rejeitado como um erro de tempo de compilação, então o instanceof A expressão relacional também produz um erro de tempo de compilação. Em tal situação, o resultado do instanceof A expressão nunca poderia ser verdadeira.

Ou seja, como essa expressão de elenco gera um erro de tempo de compilação:

(Number) "foo"

Então, essa expressão deve:

("foo" instanceof Number)

Seu caso é um pouco mais sutil, mas o princípio é o mesmo:

  • String é uma aula final
  • String não implementa Cloneable
  • Portanto, você não pode fazer (Cloneable) aString
  • Portanto, também você não pode fazer aString instanceof Cloneable

Outras dicas

Uma questão relacionada que me deparei recentemente (e que me levou a esta página, antes de descobrir o que estava acontecendo) é que o ambiente do eclipse pode relatar "tipos de operando condicional incompatíveis" em uma expressão de 'expressão' erroneamente devido a um Missões de 'importação' para o tipo à direita da 'instância do'. Passei um tempo tentando descobrir como os tipos em questão poderiam ser incompatíveis antes de descobrir que uma importação ausente estava causando todo o problema. Espero que essa informação salve alguém algum tempo.

O compilador sabe disso String é uma aula final e não implementa Cloneable. Portanto, nenhuma instância de string pode sempre ser uma instância de Cloneable. Está impedindo que você pense que você tem um teste significativo quando ele sempre imprimirá "False".

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top