Instância - tipos de operando condicional incompatíveis
-
23-09-2019 - |
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?
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 doinstanceof
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 finalString
não implementaCloneable
- 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".