Roman Pichlik napsal(a): > Funguje to, v DAO pouzivam neco podobneho pro zjisteni enity, kterou > je parametrizovane
Nefunguje, ale už jsem pochopil, co chtěl autor toho textu o Hibernate
udělat. Když se extrahuje princip, tak je to něco takového:
import java.lang.reflect.ParameterizedType;
public class Genericka<T> {
private T t;
public T getT() {
return t;
}
@SuppressWarnings({"unchecked"})
public Genericka() {
Class<T> tClass = (Class<T>) ((ParameterizedType) getClass()
.getGenericSuperclass()).getActualTypeArguments()[0];
try {
t = tClass.newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
Genericka<String> sg = new Genericka<String>() { };
String s = sg.getT();
System.out.println("s = " + s);
}
}
prosím povšimněte si těch složených závorek ve výrazu
new Genericka<String>() { };
Je to anonymní potomek třídy Genericka. Ten trik totiž funguje
jenom u potomků generických tříd, které přiřadí parametrickému
typu předka natvrdo nějaký typ. Pokud ty závorky odděláte,
získáte přímo instanci třídy Genericka a vyhodí to výjimku
java.lang.ClassCastException: java.lang.Class cannot be cast to
java.lang.reflect.ParameterizedType
Nebo aby to bylo zřetelnější, představte si to takhle:
public class Stringova extends Genericka<String> {
public static void main(String[] args) {
Stringova sg = new Stringova();
String s = sg.getT();
System.out.println("s = " + s);
}
}
Třída Stringova není parametrizovatelná, a dědí z parametrizovatelné
třídy tak, že parametru natvrdo přiřadí String. Pak má
Stringova.class v sobě informaci, že je potomkem Genericka<String>,
čili se dá to String získat.
Takže je to tak jak jsem psal, nelze ve třídě zjistit, jak
byla parametrizována. Jen lze v jejím neparametrickém potomkovi
zjistit, čím tu parametrizovatelnost zrušil.
Makub
--
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
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
