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
--------------------------------------------------------------
smime.p7s
Description: S/MIME Cryptographic Signature
