Programování

Proč nový T () není v Javě možný

Lidé si někdy myslí, že „nový T ()“ by byl možný, pokud by došlo ke sjednocení generik. To není pravda. Zvážit:

třída Foo {

T f = nový T ();

}

S vymazáním implementujete 'new T ()' jako 'new Object ()', protože Object je vázán na T. S reifikací vytvoříte instanci objektu, jehož třída je dynamickou vazbou pro T v 'this'. Ať tak či onak, musíte spustit konstruktor bez args.

Foo ale nevyžaduje, aby typ vázaný na T (a.k.a. a svědek of T) has a no-args constructor. ‚new Foo () 'je naprosto legální, ale Integer nemá konstruktor no-args, tak jak má výraz inicializace instance volat' new T () '? Těžko může vytvořit výchozí hodnotu, která se předá konstruktoru Integer.

„nový T ()“ v zásadě není možný nominální hranice typu. (Nebo, pokud chcete, v kontextu samostatné kompilace, protože globální kompilace by mohla spočítat, že pro všechny pozorované instance Foo je zvuk „new T ()“.) C # 2.0 představil strukturální typ vázaný s názvem omezení new () povolit 'new T ()'. Už však měli potřebu zajímavých pravidel o tom, které typy mohou být svědky parametru typu, a v tomto kontextu je „veřejné omezení bez parametrů“ přímé. "Koncepty" v C ++ dále umožňují strukturální popis typů, které jsou schopné sledovat parametr typu.

Java v dohledné době nedostane hranice strukturálního typu. Nominální hranice typu C&I (průnikový typ) jsou dostatečně komplikované. V důsledku toho samotné mazání ani reifikace nemohou podporovat „nový T ()“.

Tento příběh „Proč nový T () není v Javě možný“ původně publikoval JavaWorld.

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