Programmēšana

Kāpēc jauns T () Java nav iespējams

Cilvēki dažreiz domā, ka varētu būt “jauns T ()”, ja vispārējās zāles tiktu atkārtoti atkārtotas. Tā nav taisnība. Apsveriet:

klase Foo {

T f = jauns T ();

}

Izdzēšot, jūs ieviešat “jauno T ()” kā “jaunu objektu ()”, jo objekts ir T. saite. Ar atkārtotu pārvēršanu jūs objektivizējat objektu, kura klase ir dinamiskā T saite “šajā”. Jebkurā gadījumā jums ir jāizpilda konstruktors bez argumentiem.

Bet Foo neprasa, lai tips būtu saistīts ar T (arī liecinieks no T) ir no-args konstruktors. 'new Foo ()' ir pilnīgi likumīgs, taču Integer nav no-args konstruktora, tāpēc kā instances inicializācijas izteiksmei vajadzētu izsaukt 'new T ()'? Diez vai tā var veidot noklusējuma vērtību, ko nodot Integera konstruktoram.

“jauns T ()” principā nav iespējams nomināls tipa robežas. (Vai arī, ja vēlaties, atsevišķas kompilācijas kontekstā, jo globālā kompilācija varētu aprēķināt, ka “new T ()” ir skaņa visiem novērotajiem Foo gadījumiem.) C # 2.0 ieviesa strukturāls type bound sauca jauno () ierobežojumu, lai atļautu “new T ()”. Tomēr viņiem jau bija vajadzīgi interesanti noteikumi par to, kuri tipi var būt tipa parametra liecinieki, un šajā kontekstā "publisko parametru ierobežojums" ir tiešs. C ++ "jēdzieni" iet tālāk, ļaujot strukturāli aprakstīt tipus, kas spēj būt liecinieki tipa parametram.

Java drīz negrasās iegūt strukturāla veida robežas. Formas C&I (krustojuma tips) nominālā tipa robežas ir pietiekami sarežģītas. Līdz ar to ne dzēšana, ne atkārtošana vien nevar atbalstīt “jauno T ()”.

Šo stāstu "Kāpēc jauns T () Java nav iespējams" sākotnēji publicēja JavaWorld.

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