Tak koukam, ze C# ma v tomto ohledu genericitu zmaklou lepe :-(

2009/6/16 Martin Kuba <[email protected]>:
> 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: [email protected]
> Masaryk University             http://www.ics.muni.cz/~makub/
> Botanicka 68a, 60200 Brno, CZ     mobil: +420-603-533775
> --------------------------------------------------------------
>
>



-- 
Ondra Medek

Odpovedet emailem