2009-09-29 28 views
18

Me sorprendió el día de hoy en la depuración de código para encontrar que algo como lo siguiente no lanzar una excepción en tiempo de compilación:¿Por qué compila esto?

public Test() { 
    HashMap map = (HashMap) getList(); 
} 

private List getList(){ 
    return new ArrayList(); 
} 

Como se puede imaginar, un ClassCastException se lanza en tiempo de ejecución, pero puede alguien explicar por qué el lanzamiento de un List a un HashMap se considera legal en tiempo de compilación?

+0

http://stackoverflow.com/questions/19895304/classcastexception-vs-cannot-cast-compilation-error/37190861#37190861 –

Respuesta

29

Porque concebiblemente getList() podría estar devolviendo una subclase de HashMap que también implementa List. Improbable, sí, pero posible, y por lo tanto compilable.

+9

+1: Un lanzamiento explícito es básicamente una situación donde el programador le dice al compilador "I Sé lo que estoy haciendo, hágalo a mi manera "- si el compilador no sabe que realmente está realmente equivocado, lo hará a su manera. Bueno, esa es una forma en que me lo explicaron. – weiji

+3

Sí, el compilador debería quejarse si reemplaza 'List' con' ArrayList'. –

+0

@weiji: Eso solo es cierto hasta cierto punto, y mucho menos cierto que en C o C++. El compilador de java solo te dará tanta soga, y si A no puede ser una instancia de B, no compilará. – skaffman

17

Para una cosa La lista es una interfaz. No hay ninguna razón por la cual no podría existir una subclase de HashMap que también implemente la interfaz de la Lista. En esta situación, sería perfectamente válido.

Cuestiones relacionadas