Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: stud 29. 08. 2015, 08:07:51
-
Potřebuju v generické třídě vytvořit objekt, v C# to jde v pohodě pomocí "new T()", pokud je třída deklarována jako
class A<T> where T : new()
V Javě ale zaboha nemůžu přijít na to, jak to udělat (kromě odporného použití reflexe, což pochopitelně nechci). Existuje nějaká alternativa, nebo to nemůžu najít, protože to nejde?
-
neda sa
v jave je type erasure
new T sa prevedie po kompilacii na new Object
lebo zpetna kompatibilita
-
AFAIK Java to neumí. Musíte buď předat továrnu, která objekt vytvoří, nebo použít Class<T> a metodu newInstance() - pokud není možné zavolat nulární konstruktor vyhodí výjimku za běhu (což není zrovna ideální).
-
... V Javě ale zaboha nemůžu přijít na to, jak to udělat (kromě odporného použití reflexe, což pochopitelně nechci). ...
Na pouziti reflexe neni inherentne nic spatneho. Bezne se pouziva a napr. v tomto pripade bych ji preferoval pred tovarnami = boilerplate. Jedinne opodstatneni kdy nepozit reflexi a spokojit se s berlickou jsou vykonostni problemy. (Ale i tam jsou pro nektere pripady alternativy (http://monnef.tk/blog/development/benchmark-of-reflection-in-java/), jak reflexi pouzit, pripadne prejit k dynamickemu generovani/modifikaci bytekodu za behu.)
-
predat Supplier<T> do metody a ve volani si vybrat vhodny konstruktor T. Reflexe muze vest k runtime chybam, jelikoz neni zaruceno, ze T ma verejny konstruktor bez parametru.
-
... V Javě ale zaboha nemůžu přijít na to, jak to udělat (kromě odporného použití reflexe, což pochopitelně nechci). ...
Na pouziti reflexe neni inherentne nic spatneho. Bezne se pouziva a napr. v tomto pripade bych ji preferoval pred tovarnami = boilerplate. Jedinne opodstatneni kdy nepozit reflexi a spokojit se s berlickou jsou vykonostni problemy. (Ale i tam jsou pro nektere pripady alternativy (http://monnef.tk/blog/development/benchmark-of-reflection-in-java/), jak reflexi pouzit, pripadne prejit k dynamickemu generovani/modifikaci bytekodu za behu.)
Reflexe je zlo. Slušný OOP jazyk by měl nabízet rozumné možnosti. Java je designově moc omezená.