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.
//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