Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: stud 29. 08. 2015, 08:07:51

Název: Obdoba where T : new() v Javě
Přispěvatel: 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?
Název: Re:Obdoba where T : new() v pJavě
Přispěvatel: perceptron 29. 08. 2015, 09:15:17
neda sa

 v jave je type erasure

new T sa prevedie po kompilacii na new Object

lebo zpetna kompatibilita
Název: Re:Obdoba where T : new() v Javě
Přispěvatel: Radek Miček 29. 08. 2015, 09:21:02
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í).
Název: Re:Obdoba where T : new() v Javě
Přispěvatel: noef 29. 08. 2015, 13:02:32
... 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.)
Název: Re:Obdoba where T : new() v Javě
Přispěvatel: Ziktofel 29. 08. 2015, 20:38:29
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.
Název: Re:Obdoba where T : new() v Javě
Přispěvatel: zboj 29. 08. 2015, 21:31:37
... 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á.