Tipos de casting
Implícito, conhecido como upcasting, quando transformamos uma variável com valor/referência de tipo mais específico em uma variável de tipo menos específico, ou seja, estamos subindo na nossa hierarquia, esse tipo de cast é realizado automaticamente.
Supondo que a classe cachorro extenda a classe Animal
Cachorro toto = new Cachorro();
Animal toto2 = toto;
Explícito, conhecido como downcasting, quando transformamos uma variável com valor/referência de tipo menos específico em uma variável de tipo mais específico, ou seja, estamos descendo na nossa hierarquia, esse tipo de cast é realizado manualmente.
Supondo que a classe cachorro extenda a classe Animal
Animal toto2 = new Cachorro();
Cachorro toto = (Cachorro) toto2;
@Alisson, Letra D = conversão, Letra B = casting (implícito)
São conceitos diferentes porque a conversão de tipo primitivo pode haver perda e ser irreversível, por exemplo: se converter um float para int, as casas decimais serão perdidas para sempre
Já no casting não, posso fazer casting de Filho para Pai e depois fazer o cast inverso sem perder nada, pois é só uma referência, o objeto em si fica inalterado