Ohjelmointi

Miksi uusi T () ei ole mahdollista Javassa

Ihmiset ajattelevat joskus, että "uusi T ()" olisi mahdollista, jos geneeriset lääkkeet vahvistettaisiin. Tämä ei ole totta. Harkitse:

luokka Foo {

Tf = uusi T ();

}

Pyyhkimällä otat uuden 'T (): n käyttöön' uudena objektina () ', koska objekti on T: n sidos. Uudelleenvahvistamisen avulla olet havainnollistanut objektin, jonka luokka on T: n dynaaminen sidonta' tässä '. Joko niin, sinun on suoritettava no-args -rakentaja.

Mutta Foo ei vaadi, että tyyppi, joka on sidottu T: hen (alias todistaja T: llä) on no-args-konstruktori. 'uusi Foo ()' on täysin laillista, mutta kokonaisluvulla ei ole no-args-konstruktoria, joten miten instanssin alustuslausekkeen pitäisi kutsua 'uutta T ()'? Se tuskin voi olla oletusarvo välitettäväksi Integerin rakentajalle.

'uusi T ()' ei ole periaatteessa mahdollista nimellinen tyyppi rajoja. (Tai, jos haluat, erillisen kokoamisen yhteydessä, koska maailmanlaajuinen kokoelma voisi laskea, että 'uusi T ()' on ääni kaikille havaituille Foo-ilmentymille.) C # 2.0 esitteli rakenteellinen tyyppi sidottu kutsui uutta () rajoitetta sallimaan uuden T (). Heillä oli kuitenkin jo tarve mielenkiintoisille säännöille siitä, mitkä tyypit voivat todistaa tyypin parametrin, ja tässä yhteydessä "julkinen parametriton rajoitus" on yksinkertainen. C ++ "käsitteet" menevät pidemmälle sallien rakenteellisen kuvauksen tyyppeistä, jotka pystyvät todistamaan tyypin parametrin.

Java ei aio saada rakenteellisia rajoituksia pian. C & I-muodon nimelliset tyypin rajat (leikkaustyyppi) ovat riittävän monimutkaisia. Näin ollen poistaminen tai korjaaminen yksinään ei voi tukea uutta T: tä ().

Tämän tarinan "Miksi uusi T () ei ole mahdollista Javassa" julkaisi alun perin JavaWorld.

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