java - programacion - curso android desarrollo de aplicaciones móviles pdf
La cadena se asigna a una lista sin un error de compilación (1)
Este no es un problema de borrado de tipo per se, sino casi lo contrario: se produce un problema en el tiempo de ejecución, cuando el sistema conoce los tipos reales, pero no en el momento de la compilación. La razón por la que esto se compila es que la List
es una interfaz. En lo que concierne al compilador, una subclase de String
podría implementar esa interfaz, por lo que el compilador puede considerar que podría haber situaciones de tiempo de ejecución válidas en las que el objeto real devuelto sea una String
que también sea una List
. El compilador no considera que String sea final, y por lo tanto es imposible crear una clase de String
implementación de listas.
En cuanto a por qué final no se considera durante la compilación, el comentario de Bohemian a la pregunta da una buena explicación.
Esta pregunta ya tiene una respuesta aquí:
Como sé, uno de los propósitos principales de los genéricos en Java es proporcionar seguridad de tipo de compilación. Si se compila, el código se ejecutará sin problemas.
Entonces, ¿por qué se está compilando el siguiente código?
public static void main(String[] args) {
String s = getList();
}
private static <T extends List> T getList() {
return (T)new ArrayList();
}
Se compila bien. ¿Dónde está mi compilación de tipo seguro? El método getList()
no tiene nada en común con la clase String
.