generic instanceof

Tomáš Záluský zalusky na centrum.cz
Pátek Červen 13 09:59:50 CEST 2008


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: martin.beranek na i.cz
> Komu: Java <konference na java.cz>
> 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
>




Další informace o konferenci Konference