Pessoal o caso é o seguinte, fazendo os exercícios me deparei com esta questão:
public class Redwood extends Tree {
public static void main(String[] args) {
new Redwood().go();
}
void go() {
go2(new Tree(), new Redwood());
go2((Redwood) new Tree(), new Redwood());
}
void go2(Tree t1, Redwood r1) {
Redwood r2 = (Redwood)t1; [b]No eclipse o erro ocorreu nessa linha, ao tentar converter t1 para Redwood[/b]
Tree t2 = (Tree)r1;
}
}
class Tree { }
O livro diz que esta é a resposta: Answer: ® ✓ A is correct, a ClassCastException will be thrown when the code attempts to downcast a
Tree to a Redwood.
Entendi o que aconteceu. O livro cita downcasting quando tentamos converter um tipo geral para um tipo mais específico e fala na necessidade disso ser explícito. No caso de upcasting (tipo específico para tipo geral) o casting pode ser explicíto ou implícito. O problema é que no livro fala do downcasting mas deixa mto vago. Pra ser mais direto ele não fala se downcasting funciona pq ambos os exemplos parece que deram pau. O livro menciona e fala sobre os erros que vem a tempo de execução. Então fiquei na dúvida se o downcasting funciona mesmo ou se o livro só abordou pra exemplificar. Por exemplo no seguinte código
class Animal { }
class Dog extends Animal { }
class DogTest {
public static void main(String [] args) {
Animal animal = new Animal();
Dog d = (Dog) animal; // compiles but fails later
}
}
deu pra entender que o compilador não enxerga o problema pois estão na mesma árvore de herança. Pra poder ocorrer um cast pelo que entendi seria necessário fazer a afirmação dog é uma instância de animal e não animal é uma instância de dog.
No caso do exercicio RedWood(madeira vermelha) é um tipo (instância) de tree(árvore) e não árvore é um tipo de madeira vermelha.
Pela minha conclusão o downcasting então não existe, apenas o upcasting onde é possível atribuir um objeto de uma subclasse num tipo mais genérico, pq ao contrário isso não é possível, e o livro não mencionou explicitamente. Estou certo??