La comprobación de tipos es unos de los chequeos que se realizan en el tiempo de compilación dentro de lo que llamaría el chequeo de sintaxis por decirlo de alguna manera,
en este caso, tanto el IDE que utilices como la compilación detectarán el fallo en la sintaxis.
También podrías tener problemas con "los tipos de datos" en tiempo de ejecución, sobre todo cuando utilizas los conceptos de abstracción, interfaz o herencia, donde para el compilador sintacticamente hablando será correcto pero en tiempo de ejecución será incorrecto.
Intentare explicarme: Imaginemos que tenemos una interfaz Vehiculo, y tenemos dos clases que la implementan, la clase Coche y la clase Camion.
Código Java:
Ver original/**
* Pinta por pantalla los datos del vehiculo
*
* @param iVehiculo (Puede ser por ejemplo un objeto Coche o un objeto Camion)
*/
void obtenerDatosVehiculo(final Vehiculo iVehiculo) {
Coche objCoche = (Coche) iVehiculo;
Logger.getLogger(CastObject.CLASE).log(Level.INFO, objCoche.toString());
}
En el código se puede ver como en ese método podemos recibir tanto objetos coche como objetos camión, pero sea lo que sea (coche o camión), siempre se hace un casting a la clase Coche, por lo que cuando recibamos un camión como argumento, nos dará un ClassCastExcepcion en tiempo de ejecución, ya que sintacticamente hablando es correcto y el compilador nos compilará el programa.
No sé si esto responde a tu pregunta.
Saludos.