Debes prestar atención a la transferencia forzada:
¿Cuál es el tipo real del objeto? Entonces, la conversión forzada mínima solo se puede convertir a este tipo.
Primero, veamos un fragmento de código:
public class Cast extends Super_Cast2{
public static void main(String[] args) {
// TODO Auto-generated method stub
Super_Cast2 s2 = new Super_Cast2();
Super_Cast1 s1 = s2;
System.out.println(s2);
Cast cast = (Cast)s1;
}
@Override
public void check() {
// TODO Auto-generated method stub
System.out.println("Cast");
}
}
class Super_Cast1{
public void check() {
System.out.println("Super_Cast1");
}
}
class Super_Cast2 extends Super_Cast1{
public void check() {
System.out.println("Super_Cast2");
}
}
Solución: Analicemos el código, Cast hereda Super_Cast2, Super_Cast2 hereda Super_Cast1, es decir, Super_Cast1> Super_Cast2> Cast. Debido a que un objeto hijo se puede considerar como un tipo padre, s1 = s2 es un upcast polimórfico. Y Cast cast = (Cast) s1 es una conversión coercitiva, es decir, el ancestro de s1 está obligado al tipo Cast. ¿Esta operación es exitosa? Compilemoslo y veamos el resultado:
tpp.Super_Cast2@15db9742
Exception in thread "main" java.lang.ClassCastException: tpp.Super_Cast2 cannot be cast to tpp.Cast
at tpp.Cast.main(Cast.java:10)
Obviamente, esto no funcionará, ¿por qué? Primero, veamos el código de Super_Cast2 s2 = new Super_Cast2 (). Esta oración representa que Super_Cast2 creó el objeto s2. Pero hay una nota en la gramática polimórfica, es decir: cuál es el tipo real del objeto, entonces la conversión forzada mínima solo se puede convertir a este tipo, por lo que la clase Super_Cast2 es el tipo mínimo. Pero debido a que la clase Super_Cast2 es la clase principal de la clase Cast, el s1 que se transforma de s2 hacia arriba no se puede forzar a emitir.
Solución:
cambie Super_Cast2 s2 = new Super_Cast2 () en el código a Super_Cast2 s2 = new Cast ().
public class Cast extends Super_Cast2{
public static void main(String[] args) {
// TODO Auto-generated method stub
Super_Cast2 s2 = new Cast();
Super_Cast1 s1 = s2;
System.out.println(s2);
Cast cast = (Cast)s1;
}
@Override
public void check() {
// TODO Auto-generated method stub
System.out.println("Cast");
}
}
class Super_Cast1{
public void check() {
System.out.println("Super_Cast1");
}
}
class Super_Cast2 extends Super_Cast1{
public void check() {
System.out.println("Super_Cast2");
}
}
resultado:
tpp.Cast@15db9742
Análisis:
Debido a que ahora es Super_Cast2 s2 = new Cast (), significa que el tipo más pequeño que s2 se puede convertir forzosamente es Cast, y s1 que se transforma hacia arriba de s2 se puede convertir forzosamente en cast.
Espero ayudar a la mayoría de los estudiantes de Java, gracias a todos