Programovanie

Prečo nový T () nie je v Jave možný

Ľudia si niekedy myslia, že „nový T ()“ by bol možný, ak by došlo k zjednoteniu generík. To nie je pravda. Zvážte:

trieda Foo {

Tf = nový T ();

}

Pri vymazaní implementujete „new T ()“ ako „new Object ()“, pretože Object je viazaný na T. S reifikáciou inštanujete objekt, ktorého trieda je dynamickou väzbou pre T v „this“. Či tak alebo onak, musíte spustiť konštruktor bez argov.

Foo ale nevyžaduje, aby typ viazaný na T (a.k.a. a svedok of T) has a-args constructor. „new Foo ()“ je úplne legálne, ale Integer nemá konštruktor bez argov, tak ako má výraz inicializácie inštancie volať „new T ()“? Ťažko môže vytvoriť predvolenú hodnotu, ktorá sa má odovzdať konštruktorovi Integer.

„nový T ()“ nie je v zásade možný v kontexte nominálny hranice typu. (Alebo, ak chcete, v kontexte samostatnej kompilácie, pretože globálna kompilácia dokáže vypočítať, že zvuk „new T ()“ je zvukový pre všetky pozorované inštancie Foo.) C # 2.0 zaviedol štrukturálne typ viazaný s názvom new () obmedzenie povoľujúci 'new T ()'. Už predtým však potrebovali zaujímavé pravidlá, ktoré typy môžu byť svedkami parametra typu, a v tejto súvislosti je „verejné obmedzenie bez parametrov“ priame. „Koncepty“ v C ++ idú ďalej v povoľovaní štrukturálneho opisu typov, ktoré sú schopné byť svedkami parametra typu.

Java tak skoro nebude mať hranice štrukturálneho typu. Nominálne hranice typu C&I (križovatkový typ) sú dosť komplikované. Z toho vyplýva, že ani samotné vymazanie, ani opakovanie nemôže podporiť „nový T ()“.

Tento príbeh, „Prečo nie je v TJ možné nové T ()“, bol pôvodne publikovaný v JavaWorld.

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