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.