En Java, la creación de una instancia de type
parámetro es ilegal, por lo que el siguiente código no funcionará:
class Gen<T> {
T ob;
Gen() {
ob = new T(); // Illegal!!!
}
}
La razón detrás de esto es:
T no existe en tiempo de ejecución, entonces, ¿cómo sería el know compilador de qué tipo de objeto a crear.
Pero lo que no entiendo es, usando erasure
el siguiente código se traducirá en:
class Gen {
Object ob;
Gen() {
ob = new Object(); // Perfectly Fine!!!
}
}
Porque:
Cuando se compila el código Java, se elimina toda la información de tipo genérico (borrado). Esto significa reemplazar los parámetros de tipo con su tipo límite, que es
Object
si no se especifica límite explícito.
Entonces, ¿por instancias de un type
parámetro es ilegal?
Sencillo: porque eso T
podría ser cualquier cosa.
Suponga que tiene una Gen<Integer>
. Sorpresa: Entero no no tiene un constructor por defecto. Entonces, ¿cómo va a hacer new Integer()
a continuación?
El compilador no puede saber si existe un constructor por defecto para lo que viene en como T
.
java.lang.Object
obviamente, tiene como un constructor.