Zdravím,
jak bylo psáno, nejde to z důvodu, že generické informace nepřežijí do okamžiku 
běhu programu. Tohle je problém, se kterým generické třídy moc nepomáhají. Aby 
to fungovalo, je třeba příslušný typ mít uložený jako Class object. Takže to 
chce přidat ještě Class do Plugin. Např.

interface Plugin <T> {
        Class<T> getParameterClass();
}

class Plugin1 implements Plugin<Number> {
        Class<Number> getParameterClass() {
                return Number.class;
        }
}

Pokud získáváte třídu přes Class.forName, pak zřejmě narazíte ještě na problém, 
že generický parametr třídy se vztahuje jen na instanční členy, ne na statické. 
Takže pokud je k dispozici instance resp. prototyp, pak se využije

Class<?> pluginClass = Class.forName("Plugin1");
Class<?> parameterClass = 
((Plugin1)pluginClass.newInstance()).getParameterClass();

Jediným přínosem generik je v tomto případě to, že v definici Plugin garantují 
shodu vrácené classy s typovým parametrem. Je otázka, jestli to vyváží zbylé 
nevýhody. Alternativně by např. šlo tu Number.class dát do anotace třídy 
Plugin1 (to by obešlo nutnost mít instanci).

Tomáš Záluský

================================================
...with Ultimate flying is so easy...
http://www.frisbee.cz    http://www.peaceegg.net
================================================





______________________________________________________________
> Od: [EMAIL PROTECTED]
> Komu: Java <[email protected]>
> Datum: 13.06.2008 08:53
> Předmět: generic instanceof
>
>Zdravím konferenci,
>
>narazil sem na zajímavý problém - nemůžu vygooglit řešení... navíc po
přečtení 
>tohoto: http://www.ibm.com/developerworks/java/library/j-jtp01255.html si

>nejsem jistý jestli řešení existuje, takže:
>
>mám abstraktní třídu A<T>. V této třídě načítám pluginy (přes
Class.forName) - 
>rozhraní pro pluginy mám definované jako:
>
>interface Plugin<T> {
>       boolean execute(T param);
>}
>
>V třídě A bych před zavoláním execute potřeboval ověřit, že:
>
>plugin instanceof Plugin<T>
>
>tedy že plugin typově sedí k dané implementaci. Například:
>
>"class Plugin1 implements Plugin<Number>" půjde zavolat z "class B
extends 
>A<Integer>" ale ne z "class C extends A<String>"
>
>dále poznamenám že v abstraktní třídě A mám k dispozici proměnnou typu 
>Class<T>
>
>-- 
>Martin Beránek
>

Odpovedet emailem