Por qué no es posible new T () en Java

La gente a veces piensa que la 'nueva T ()' sería posible si se reificaran los genéricos. Esto no es verdad. Considerar:

class Foo {

T f = nuevo T ();

}

Con el borrado, implementas 'new T ()' como 'new Object ()', ya que Object es el límite de T. Con la reificación, creas una instancia de un objeto cuya clase es el enlace dinámico para T en 'this'. De cualquier manera, debe ejecutar un constructor sin argumentos.

Pero Foo no requiere que un tipo vinculado a T (también conocido como testigo de T) tenga un constructor sin argumentos. 'new Foo ()' es perfectamente legal, pero Integer no tiene un constructor sin argumentos, entonces, ¿cómo se supone que la expresión de inicialización de la instancia debe llamar a 'new T ()'? Difícilmente puede crear un valor predeterminado para pasar al constructor de Integer.

'new T ()' fundamentalmente no es posible en el contexto de límites de tipo nominal . (O, si lo prefiere, en un contexto de compilación separada, ya que una compilación global podría calcular que 'new T ()' es correcto para todas las instanciaciones observadas de Foo.) C # 2.0 introdujo un tipo de enlace estructural llamado la restricción new () para permitir 'nueva T ()'. Sin embargo, ya tenían la necesidad de reglas interesantes sobre qué tipos pueden ser testigos de un parámetro de tipo, y en ese contexto la "restricción pública sin parámetros" es sencilla. Los "conceptos" de C ++ van más allá al permitir una descripción estructural de los tipos capaces de presenciar un parámetro de tipo.

Java no va a tener límites de tipo estructural en el corto plazo. Los límites de tipo nominal de la forma C&I (un tipo de intersección) son lo suficientemente complicados. En consecuencia, ni el borrado ni la cosificación por sí solos pueden sustentar la 'nueva T ()'.

Esta historia, "Por qué el nuevo T () no es posible en Java" fue publicada originalmente por JavaWorld.