2 regras:
Upcasting:
- Podemos atribuir um tipo específico a um genérico sem cast explícito.
- Ex: I i = new A();
Downcasting:
- Podemos fazer um cast de um tipo genérico para um específico desde que o atributo esteja referenciando este objeto específico.
- Ex: I i = new A(); A a = (A) i;
.
a) b = (A)(I)a -> Erro de compilação. Não posso atribuir "A" a "B" porque "B" não é mais genérico que "A"
b) C c = (I)b -> Erro de compilação. Não posso atribuir de "I" a "C" porque "C" não é mais genérico que "I"
c) I i = (C)a -> Erro de execução. Não posso fazer um cast do objeto mais genérico "A" para o mais específico "C".
d) a = (B)(I)b -> O cast de "B" para "I" é opcional. O cast de "I" para "B" vai dar certo porque o atributo está referenciando um objeto do tipo B. A atribuição de "B" em "A" dá certo porque "A" é mais genérico