Programmering

Hvorfor ny T () ikke er mulig i Java

Noen ganger tror folk at 'nye T ()' ville være mulig hvis generiske legemidler ble reifisert. Dette er ikke sant. Ta i betraktning:

klasse Foo {

T f = ny T ();

}

Med sletting implementerer du 'ny T ()' som 'ny Objekt ()', siden Objekt er grensen til T. Med reifisering instanserer du et objekt hvis klasse er den dynamiske bindingen for T i 'dette'. Uansett må du utføre en konstruktør uten argumenter.

Men Foo krever ikke at en type bundet til T (aka a vitne av T) har en no-args konstruktør. 'new Foo ()' er helt lovlig, men Integer har ikke en no-args-konstruktør, så hvordan skal forekomstens initialiseringsuttrykk kalle 'ny T ()'? Det kan knapt utgjøre en standardverdi å overføre til Integers konstruktør.

'ny T ()' er grunnleggende ikke mulig i sammenheng med nominell skriv grenser. (Eller, hvis du foretrekker det, i en sammenheng med separat kompilering, siden en global kompilering kan beregne at 'ny T ()' er lyd for alle observerte instantiations av Foo.) C # 2.0 introduserte en strukturell type bound kalt den nye () begrensningen for å tillate 'ny T ()'. Imidlertid hadde de allerede et behov for interessante regler om hvilke typer som kan være vitne til en typeparameter, og i den sammenheng er den "offentlige parameterløse begrensningen" grei. C ++ "konsepter" går lenger i å tillate en strukturell beskrivelse av typene som er i stand til å være vitne til en typeparameter.

Java kommer ikke til å få strukturelle grenser når som helst. Nominelle typegrenser for skjemaet C&I (en krysningstype) er kompliserte nok. Derfor kan verken sletting eller reifisering alene støtte 'ny T ()'.

Denne historien, "Why new T () is not possible in Java", ble opprinnelig utgitt av JavaWorld.

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