Hierarquia de casting, eu acho!

olá,

sou ainda verde no java, estudo em progresso, porem ja com experiencia em programação em outras linguagens. Não gosto de perturbar com perguntas das quais se podem achar material no google, mas infelizmente nao consegui achar material com clareza nesse assunto e aqui estou.

vou tentar explicar da melhor forma, para obter a melhor ajuda;

digamos que tenho essa hierarquia:

class A

B extends A

C extends B

D extends C

E extends D

F extends E

ok?

agora digamos que na eu posssa ramificar dessa forma:

A1 extends D

D1 extends A1

D2 extends D1

D3 extends D2

ou seja a partir de D da primeira estrutura ela faz uma ramificação, ai vem a pergunta:

eu posso fazer um casting em uma objeto instanciado na calsse F para a classe D2 que esta em outra ramificação?

Considerando o exemplo apresentado, eu posso dizer que a explicação é meio trivial.
Veja o grafo armengado a seguir:

Você vai perceber que F, não é “descendente” de D2, logo uma instância de F, não pode ser convertida para D2.
Também, uma instância de D2, não pode ser convertida para F, pois D2, não é “pai” de F.

O casting ocorre quando um objeto instanciado em uma classe Pai, assume a forma de um Filho (Polimorfismo).

Também ocorre um casting implícito quanto uma instância “filho” é passada como argumento de um método cujo parâmetro é a classe Pai (Polimorfismo de novo).
Não me vem outras ocorrências à mente. :relaxed:

No “geral”:
Se você converter um “Pai para um filho”, da certo.
Se tentar converter “um filho para um Pai”, da erro.

No momento tem um porém que não tenho como explicar: quando se converte int para double e situações semelhantes, pois é passado para o programador a ciência de que pode haver perda no valor convertido.

Voltando ao tema proposto, se você perceber, tanto as instâncias de D3 quanto a de F, não podem ser convertidas para nenhuma outra classe, pois elas são “fim de linha”, ou seja, não são “genitores”, são só “filhas”.

Exemplo básico, você pode converter um List em ArrayList, mas não pode converter um ArrayList em um List.

Sugestão de vídeo a partir dos 25 minutos:

Ponto interessante:
Se você instanciar um objeto de A ou B, ou C, ou D, este objeto pode assumir a forma de qualquer ramificação de D, ou seja, você pode fazer um casting para A1, D1,D2 ou D3.

Assumo que minha explanação não é das melhores. :joy: