[final classes] operador instanceof em objetos do tipo final

4 respostas
G

Olá amigos, estou com uma dúvida em uma questão do ExamLabs, gostaria que me ajudassem:
tenho o seguinte código

interface I {}

class A {}
class B implements I {}
class C extends A {}
class D {}
final class E{}

class InstOf {
	public static void main(String args[]) {
		System.out.println(new A() instanceof I); //linha 11:  compila
		System.out.println(new E() instanceof I); //linha 12:  dá um erro de compilação
	}
}

Não estou conseguindo entender porque a linha 11 compila e a linha 12 dá um erro de compilação.
A explicação do exame diz que é porque a class E é final... mas não consigo entender a lógica disso, pra mim a única funcionalidade do modificador final é não permitir que a classe seja extendida por outras.

Se eu inserir o código
System.out.println(new Object() instanceof I);
ele vai compilar normalmente (isso quer dizer que o instanceof não precisa ser necessariamente uma implementação de I pra compilar... ) Também funcionará se eu implementar o método I em E
final class E implements I{
}

A coisa mais cabível que consegui imaginar é que por reflection é possível fazer com que uma classe implemente uma interface dinâmicamente, por isso ele aceitaria outras classes (tipo a classe D ou a classe A) e inserindo o modificador final isso não seria possível...

Não sei se ficou claro, alguém poderia me ajudar?

Abs.

4 Respostas

galileu.gt

Será que não é algo do tempo de compilação?
Quando voce diz que final class E{}, e não implementa I, o compilador sabe, em tempo de compilação, que é impossível que “E” pertença à mesma parte da árvore que a interface “I”. Quando voce declara E como final (impdindo a extensão da classe), torna explícito que E não faz parte da arvore de I (E nunca sera instanceof I) no tempo de compilação, gerando o erro.

Acredito ser esse o motivo. O “final” torna impossível que os objetos das classes sejam da mesma “arvore”.

Abraço!

luiz_renato

É Galileu,

Acho que é por aí mesmo .

A extensão de classe final seria tão “proibida” que não é possível sequer fazer verificação com instanceof.

Luiz Renato

G

Então amigos, o caso é que no código:

System.out.println(new A() instanceof I); //linha 11:  compila

Existe alguma possibilidade de essa classe se tornar uma instância de I, no decorrer do código? Se sim, de que modo? (via refletion)?

Compreenderam?

Abs.

galileu.gt

Tambem não sei ao certo. O que possibilita o codigo compilar éem //11 que o que está do lado direito é uma interface.

Um amigo sugeriu que o problema esteja relacionado com o funcionamento do operador instanceof.
Pode ser, por exemplo, que o operador final impossibilite o processo de se descobrir se uma instancia é de uma classe ou nao (baixo nivel, assembly).]

É uma possibilidade. O como saber ou comprovar isso nao sei. Talvez perguntando pra alguem no javaranch.

Sabendo de algo poste ok?

Valeu!
Abraço!

Criado 7 de junho de 2010
Ultima resposta 8 de jun. de 2010
Respostas 4
Participantes 3