Zašto novi T () nije moguć na Javi

Ljudi ponekad misle da bi 'novi T ()' bio moguć kad bi se generički lijekovi reificirali. Ovo nije istina. Smatrati:

razred Foo {

T f = novo T ();

}

Brisanjem implementirate 'new T ()' kao 'new Object ()', budući da je Object granica T. Reifikacijom instancirate objekt čija je klasa dinamičko vezanje za T u 'this'. U svakom slučaju, morate izvršiti no-args konstruktor.

Ali Foo ne zahtijeva da tip vezan za T (inače svjedok T-a) ima konstruktor no-args. 'new Foo ()' je potpuno legalno, ali Integer nema konstruktor no-args, pa kako bi izraz za inicijalizaciju instance trebao pozivati ​​'new T ()'? Teško može izraditi zadanu vrijednost za prosljeđivanje Integer-ovom konstruktoru.

'novi T ()' u osnovi nije moguć u kontekstu nominalnih granica tipa. (Ili, ako želite, u kontekstu zasebne kompilacije, jer bi globalna kompilacija mogla izračunati da je 'new T ()' zvuk za sve promatrane instancije Foo-a.) C # 2.0 uveo je strukturni tip vezan pod nazivom new () ograničenje kako bi se dopustio 'novi T ()'. Međutim, već su imali potrebu za zanimljivim pravilima o tome koji tipovi mogu biti svjedoci parametra tipa, i u tom je kontekstu "javno ograničenje bez parametara" jednostavno. C ++ "koncepti" idu dalje omogućujući strukturni opis tipova koji mogu biti svjedoci parametra tipa.

Java neće uskoro dobiti granice strukturnog tipa. Nominalne tipske granice oblika C&I (presječni tip) dovoljno su složene. Slijedom toga, niti brisanje niti reifikacija ne mogu podržati 'novi T ()'.

Ovu priču "Zašto novi T () nije moguć na Javi" izvorno je objavio JavaWorld.