Perché new T () non è possibile in Java

Le persone a volte pensano che la "nuova T ()" sarebbe possibile se i generici fossero reificati. Questo non è vero. Ritenere:

class Foo {

T f = nuovo T ();

}

Con la cancellazione, si implementa 'new T ()' come 'new Object ()', poiché Object è il limite di T. Con la reificazione, si istanzia un oggetto la cui classe è l'associazione dinamica per T in 'this'. In ogni caso, devi eseguire un costruttore senza argomenti.

Ma Foo non richiede che un tipo associato a T (ovvero un testimone di T) abbia un costruttore senza argomenti. 'new Foo ()' è perfettamente legale, ma Integer non ha un costruttore senza argomenti, quindi come si suppone che l'espressione di inizializzazione dell'istanza chiami 'new T ()'? Difficilmente può creare un valore predefinito da passare al costruttore di Integer.

'new T ()' non è fondamentalmente possibile nel contesto dei limiti di tipo nominale . (O, se preferisci, in un contesto di compilazione separata, poiché una compilazione globale potrebbe calcolare che 'new T ()' è valido per tutte le istanze osservate di Foo.) C # 2.0 ha introdotto un limite di tipo strutturale chiamato vincolo new () per consentire "nuova T ()". Tuttavia, avevano già bisogno di regole interessanti su quali tipi possono essere testimoni di un parametro di tipo, e in quel contesto il "vincolo pubblico senza parametri" è semplice. I "concetti" C ++ vanno oltre consentendo una descrizione strutturale dei tipi in grado di testimoniare un parametro di tipo.

Java non otterrà presto i limiti di tipo strutturale. I limiti di tipo nominale della forma C&I (un tipo di intersezione) sono abbastanza complicati. Di conseguenza, né la cancellazione né la reificazione da sole possono supportare "new T ()".

Questa storia, "Perché new T () non è possibile in Java" è stata originariamente pubblicata da JavaWorld.