Programiranje

Zakaj nov T () v Javi ni mogoč

Ljudje včasih mislijo, da bi bil nov T () mogoč, če bi bili generiki ponovno označeni. To ni res. Razmislite:

razred Foo {

T f = nov T ();

}

Z brisanjem implementirate 'new T ()' kot 'new Object ()', ker je Object meja T. Z reifikacijo ustvarite objekt, katerega razred je dinamična vezava T v 'this'. V vsakem primeru morate izvesti konstruktor no-args.

Toda Foo ne zahteva, da je tip, vezan na T (a.k.a. a priča od T) ima konstruktor no-args. 'new Foo ()' je popolnoma zakonit, toda Integer nima konstruktorja no-args, kako naj torej izraz za inicializacijo primerka pokliče 'new T ()'? Težko je sestaviti privzeto vrednost, ki jo posreduje konstruktorju Integerja.

"novi T ()" v bistvu ni mogoč Nazivna meje tipa. (Ali, če želite, v kontekstu ločene kompilacije, saj bi lahko globalna kompilacija izračunala, da je 'new T ()' zvok za vse opažene primerke Fooja.) C # 2.0 je predstavil strukturni tip vezan, imenovan omejitev new (), da dovoli 'new T ()'. Vendar so že potrebovali zanimiva pravila o tem, kateri tipi so lahko priča parametru tipa, in v tem okviru je "javna omejitev brez parametrov" enostavna. "Koncepti" C ++ gredo še dlje, saj omogočajo strukturni opis tipov, ki so lahko priča parametru tipa.

Java kmalu ne bo dobila meja strukturnih tipov. Nazivne meje tipa oblike C&I (presečišče) so dovolj zapletene. Posledično niti izbris niti ponovitev ne moreta podpreti „novega T ()“.

To zgodbo z naslovom "Zakaj nov T () v Javi ni mogoč" je prvotno objavil JavaWorld.

$config[zx-auto] not found$config[zx-overlay] not found