Vytvoreni instance parametru, ktery je zadan v genericke tride
Ondra Medek
xmedeko na gmail.com
Úterý Červen 16 16:35:38 CEST 2009
Tak koukam, ze C# ma v tomto ohledu genericitu zmaklou lepe :-(
2009/6/16 Martin Kuba <makub na ics.muni.cz>:
> To nejde, protože pro generickou třídu existuje jen jeden soubor .class
> a parametrizace v době překladu už není k dispozici v době běhu.
>
> Vím o třech způsobech, jak tohle řešit:
>
> 1) nepoužívat pole, ale List<T>, protože vytvořit instanci Listu
> je triviální
>
> 2) zapamatovat si třídu, kterou se parametrizuje, tj.
>
> Class<T_DB> classDb;
> Class<T_WSDL> classWsdl;
>
> //konstruktor
> public DbToWsdlConvertor(Class<T_DB> classDb, Class<T_WSDL> classWsdl) {
> this.classDb = classDb;
> this.classWsdl = classWsdl;
> }
>
> public T_WSDL[] dbTypeArrayToWsdlArray() {
> T_WSDL[] ret = ( T_WSDL[] ) Array.newInstance(classWsdl, tmp.length ) ;
> ...
> }
>
> 3) využít fintu odkoukanou z Hibernate spočívající v tom, že anonymní
> potomek vzniklý parametrizací generické třídy má ve svém .class
> zakompilováno, jakou třídou se parametrizovalo. Při použití
> se musí používat anonymní potomci generické třídy, tj.
>
> DbToWsdlConvertor<TridaA,TridaB> d2w = new DbToWsdlConvertor<TridaA,TridaB>() { };
>
> a pak lze použít
>
> Class<T> classDb = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
> Class<T> classWsdl = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[1];
>
> pro zjištění, čím bylo parametrizováno.
>
> Makub
>
>
> vkrejcirik napsal(a):
>> Dobry den, chtel bych se zeptat jak by slo vytvorit instanci parametru
>> genericke tridy. Mam nasledujici kod:
>>
>> public class DbToWsdlConvertor<T_DB, T_WSDL> {
>> ...
>> public T_WSDL[] dbTypeArrayToWsdlArray() {
>> ...
>> v teto metode potrebuji vytvorit instanci pole prvku typu T_WSDL.
>> Pokousel jsem se na to jit takto:
>>
>> ParameterizedType type = (ParameterizedType)
>> this.getClass().getGenericSuperclass();
>> Class classWsdl = (Class) type.getActualTypeArguments()[1];
>> T_WSDL[] ret = ( T_WSDL[] ) Array.newInstance(classWsdl, tmp.length ) ;
>>
>> Bohuzel dostavam java.lang.ClassCastException: java.lang.Class
>>
>> Mohl by mi nekdo poradit? Dekuji
>>
>
>
> --
> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> Supercomputing Center Brno Martin Kuba
> Institute of Computer Science email: makub na ics.muni.cz
> Masaryk University http://www.ics.muni.cz/~makub/
> Botanicka 68a, 60200 Brno, CZ mobil: +420-603-533775
> --------------------------------------------------------------
>
>
--
Ondra Medek
Další informace o konferenci Konference