Coerción del polimorfismo orientado a objetos de Java

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

Supongo que te gusta

Origin blog.csdn.net/qq_42039952/article/details/114937336
Recomendado
Clasificación