Categorías
Classes & Interfaces

¿Cómo funciona la verificación de tipos estáticos en Java?

De Wiki:

La verificación de tipo estática es el proceso de verificar la seguridad del tipo de un programa basado en el análisis del código fuente de un programa.

La verificación de tipo dinámica es el proceso de verificar la seguridad del tipo de un programa en tiempo de ejecución

Java utiliza la verificación de tipos estáticos para analizar el programa durante la compilación para demostrar la ausencia de errores de tipo. La idea básica es nunca dejar que sucedan cosas malas en tiempo de ejecución. Al comprender el siguiente ejemplo, debe comprender bien cómo funciona la verificación de tipos estáticos en Java.

Ejemplo de código

Supongamos que tenemos las siguientes clases, A y B. B extiende A.

class A {
	A me() {
		return this;
	}
 
	public void doA() {
		System.out.println("Do A");
	}
}
 
class B extends A {
	public void doB() {
		System.out.println("Do B");
	}
}

En primer lugar, ¿qué devuelve «new B (). Me ()»? ¿Un objeto A o un objeto B?

Se declara que el método me () devuelve una A, por lo que durante el tiempo de compilación, el compilador solo ve que devuelve un objeto A. Sin embargo, en realidad devuelve un objeto B durante el tiempo de ejecución, ya que B hereda los métodos de A y lo devuelve (él mismo).

¿Cómo funciona la verificación de tipo estático?

La siguiente línea será ilegal, aunque el objeto que se invoca sea un objeto B. El problema es que su tipo de referencia es A. El compilador no conoce su tipo real durante el tiempo de compilación, por lo que ve el objeto como tipo A.

  ¿Por qué no se puede anular el campo?
//illegal
new B().me().doB();

Por lo tanto, solo se puede invocar el siguiente método.

//legal
new B().me().doA();

Sin embargo, podemos convertir el objeto al tipo B, como el siguiente:

//legal
((B) new B().me()).doB();

Si se agrega la siguiente clase C,

class C extends A{
	public void doBad() {
		System.out.println("Do C");
	}
}

entonces la siguiente declaración es legal y puede pasar la verificación de tipo estático:

//legal
((C) new B().me()).beBad();

El compilador no sabe que es en tiempo real, pero el tiempo de ejecución lanzará una excepción de conversión ya que B no se puede convertir en C:

 java.lang.ClassCastException: B cannot be cast to C

Referencias:
1. Tipo de sistema

Por Programación.Click

Más de 20 años programando en diferentes lenguajes de programación. Apasionado del code clean y el terminar lo que se empieza. ¿Programamos de verdad?

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *