Obdoba where T : new() v Javě

stud

Obdoba where T : new() v Javě
« kdy: 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?


perceptron

Re:Obdoba where T : new() v pJavě
« Odpověď #1 kdy: 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

Radek Miček

Re:Obdoba where T : new() v Javě
« Odpověď #2 kdy: 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í).

noef

  • *****
  • 897
    • Zobrazit profil
    • E-mail
Re:Obdoba where T : new() v Javě
« Odpověď #3 kdy: 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, jak reflexi pouzit, pripadne prejit k dynamickemu generovani/modifikaci bytekodu za behu.)

Re:Obdoba where T : new() v Javě
« Odpověď #4 kdy: 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.


zboj

  • *****
  • 1 507
    • Zobrazit profil
    • E-mail
Re:Obdoba where T : new() v Javě
« Odpověď #5 kdy: 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, 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á.