Programavimas

Kodėl „Java“ neįmanoma naujas T ()

Žmonės kartais galvoja, kad „nauji T ()“ būtų įmanomi, jei generiniai vaistai būtų atkurti. Tai netiesa. Apsvarstykite:

klasė Foo {

T f = naujas T ();

}

Ištrynę, jūs įdiegiate „naujas T ()“ kaip „naują objektą ()“, nes objektas yra T. susietas. Su reifikavimu jūs išrandate objektą, kurio klasė yra dinaminis T susiejimas „šiame“. Bet kuriuo atveju turite vykdyti konstruktorių be argumentų.

Tačiau Foo nereikalauja, kad tipas būtų susietas su T (dar žinomas kaip liudytoju iš T) turi konstruktorių be argumentų. „new Foo ()“ yra visiškai teisėtas, tačiau sveikasis skaičius neturi konstruktoriaus „no-args“, taigi kaip egzemplioriaus inicijavimo išraiška turėtų vadinti „new T ()“? Vargu ar tai gali sudaryti numatytąją vertę, kurią reikia perduoti „Integer“ konstruktoriui.

„naujas T ()“ iš esmės neįmanoma vardinis tipo ribos. (Arba, jei norite, atskiro kompiliavimo kontekste, nes visuotinis kompiliavimas galėtų apskaičiuoti, kad „naujas T ()“ yra patikimas visiems pastebėtiems „Foo“ momentams.) C # 2.0 pristatė struktūrinis tipas surištas vadinamas naujuoju () apribojimu, kad būtų leista naudoti „naują T ()“. Tačiau jiems jau buvo reikalingos įdomios taisyklės, kurie tipai gali būti tipo parametro liudininkai, ir šiame kontekste „viešasis parametrų apribojimas“ yra aiškus. C ++ „sąvokos“ leidžia toliau apibūdinti tipus, galinčius paliudyti tipo parametrą.

„Java“ artimiausiu metu neketina riboti struktūrinio tipo. C & I formos (sankirtos tipo) nominalaus tipo ribos yra pakankamai sudėtingos. Todėl nei ištrynimas, nei pakartojimas vien „naująjį T ()“ negali paremti.

Šią istoriją „Kodėl naujas T () negalima naudoti„ Java ““ iš pradžių paskelbė „JavaWorld“.

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