Warum neues T () in Java nicht möglich ist

Die Leute denken manchmal, dass 'neues T ()' möglich wäre, wenn Generika reifiziert würden. Das ist nicht wahr. Erwägen:

Klasse Foo {

T f = neues T ();

}}

Beim Löschen implementieren Sie 'new T ()' als 'new Object ()', da Object die Grenze von T ist. Mit der Reifizierung instanziieren Sie ein Objekt, dessen Klasse die dynamische Bindung für T in 'this' ist. In beiden Fällen müssen Sie einen Konstruktor ohne Argumente ausführen.

Aber Foo verlangt nicht, dass ein an T gebundener Typ (auch bekannt als Zeuge von T) einen Konstruktor ohne Argumente hat. 'new Foo ()' ist vollkommen legal, aber Integer hat keinen Konstruktor ohne Argumente. Wie soll der Ausdruck für die Instanzinitialisierung also 'new T ()' aufrufen? Es kann kaum einen Standardwert bilden, der an den Integer-Konstruktor übergeben wird.

'new T ()' ist im Zusammenhang mit nominalen Typgrenzen grundsätzlich nicht möglich . (Oder, wenn Sie es vorziehen, in einem Kontext einer separaten Kompilierung, da eine globale Kompilierung berechnen könnte, dass 'new T ()' für alle beobachteten Instanziierungen von Foo geeignet ist.) C # 2.0 führte eine Strukturtypgrenze ein , die als new () -Einschränkung bezeichnet wird 'neues T ()' zulassen. Sie brauchten jedoch bereits interessante Regeln darüber, welche Typen Zeuge eines Typparameters sein können, und in diesem Zusammenhang ist die "öffentliche parameterlose Einschränkung" unkompliziert. C ++ "Konzepte" gehen noch weiter und ermöglichen eine strukturelle Beschreibung der Typen, die Zeuge eines Typparameters werden können.

Java wird in Kürze keine strukturellen Typgrenzen mehr erhalten. Nominale Typgrenzen der Form C & I (ein Kreuzungstyp) sind kompliziert genug. Folglich kann weder das Löschen noch die Verdinglichung allein "neues T ()" unterstützen.

Diese Geschichte "Warum neues T () in Java nicht möglich ist" wurde ursprünglich von JavaWorld veröffentlicht.