Hallo zusammen,
ich habe ein kleines aber unschönes Problem mit der Zuweisung von parametrisierten Typen. Nehmen wir einmal an, ich hätte drei Interfaces:
Ein gegebenes Action Object verknüpfe ich über eine Annotation mit ihrem ActionHandler; seine einzige Methode gibt die Klasse des benötigten ActionHandlers zurück. Ich muss hier natürlich Wildcards verwenden, weil Annotationen ja nicht parametrisiert werden können!
Nicht perfekt (ich könnte zwei verschiedene Result-Objekte verwenden), aber soweit, so gut.
Merkwürdig wird es dann, wenn ich versuche, einen ActionHandler auszuführen. Dazu verwende ich folgende Methode, die in einer Klasse Dispatcher untergebracht ist; die Klasse selbst spielt keine Rolle.
Bei der Zuweisung im try Block bekomme ich dann eine Fehlermeldung die mir erzählt, die beiden Typen wären nicht kompatibel. Liegt dass daran, dass der Typ, der aus der Annotation kommt, Erasures enthält? Oder liegt es an etwas ganz anderem?
Über eure Hilfe würde ich mich sehr freuen!
Einen schönen Abend noch,
Goldi
ich habe ein kleines aber unschönes Problem mit der Zuweisung von parametrisierten Typen. Nehmen wir einmal an, ich hätte drei Interfaces:
Java:
interface Result { }
interface Action<R extends Result> { }
interface ActionHandler<A extends Action<R>, R extends Result> {
R execute(A action);
}
Ein gegebenes Action Object verknüpfe ich über eine Annotation mit ihrem ActionHandler; seine einzige Methode gibt die Klasse des benötigten ActionHandlers zurück. Ich muss hier natürlich Wildcards verwenden, weil Annotationen ja nicht parametrisiert werden können!
Java:
@interface HandledBy {
Class<? extends ActionHandler<? extends Action<? extends Result>, ? extends Result>> value();
}
Nicht perfekt (ich könnte zwei verschiedene Result-Objekte verwenden), aber soweit, so gut.
Merkwürdig wird es dann, wenn ich versuche, einen ActionHandler auszuführen. Dazu verwende ich folgende Methode, die in einer Klasse Dispatcher untergebracht ist; die Klasse selbst spielt keine Rolle.
Java:
public class Dispatcher {
public <A extends Action<R>, R extends Result> R execute(A action) {
// liest die Annotation von der Action aus, die uns verrät, mit welchem ActionHandler wir sie ausführen müssen!
HandledBy handledBy = action.getClass().getAnnotation(HandledBy.class);
R result = null;
try {
// Instanz des speziellen ActionHandlers erstellen
ActionHandler<A, R> handler = handledBy.value().newInstance();
// die Action mit ihrem eigenen ActionHandler ausführen und das Ergebnis einkassieren!
result = handler.execute(action);
} // catch clauses omitted for brevity
return result;
}
}
Bei der Zuweisung im try Block bekomme ich dann eine Fehlermeldung die mir erzählt, die beiden Typen wären nicht kompatibel. Liegt dass daran, dass der Typ, der aus der Annotation kommt, Erasures enthält? Oder liegt es an etwas ganz anderem?
Über eure Hilfe würde ich mich sehr freuen!
Einen schönen Abend noch,
Goldi