Hallo,
ich habe im Rahmen eines Frameworks eine Klasse ListenerHelper die von javax.swing.event.EventListenerList erbt. Sie ist quasi die Hilfsmethode um bei selbstdefinierten Datenklassen entsprechende Events zu der entsprechenden List hinzuzufügen.
In Java 1.4.2 sahen die add/remove Methoden, die die von EventListenerList überschrieben haben, so aus:
Der Aufruf aus den Datenklassen sah zb so aus:
Hierbei gibt es eben für die Datenklassen immer auch entsprechende Listener.
Jetzt ist halt meine Aufgabe, dass ganze in Java 1.5 zum Laufen zu bringen.
Ohne irgendwas zu verändern bekomme ich die Fehlermeldung:
Habe ich in der javadoc nachgeschaut, steht nun bei EventListenerList:
Also eine "generische" Parameterliste (oder wie man das auch immer genau bezeichnet).
Ändere ich jetzt meine Klasse in ListenerHelper<T> und passe die add/remove Methoden entsprechend der Signatur aus 1.5 an sind erstmal alle Fehler weg.
Leider aber bis auf einen. Denn innerhalb von ListenerHelper gibt es eine Methode die aus einer Datei die gespeicherten Werte ausliest. Das sind dann alles Objects. Mein Problem ist nun, die entsprechend im add-Methodenaufruf zu casten.
Die alte (1.4.2) Methode sieht so aus:
Der Fehler lautet da
Den EventListener bekomme ich ja hin, ein ein T anstelle des EventListener.
Aber wie caste ich jetzt das ausgelesene Object richtig? Ich weiss ja dass es entweder null ist oder irgendeine Klasse (entsprechend der Datenklassen) die von EventListener erbt. Ich probier da jetzt schon ne Weile rum, komme aber auf gar keinen grünen Zweig. Ist denn der Ansatz, die EventListenerList-Klasse als Generic zu machen sinnvoll/richtig? Vielleicht liegt der Fehler ja auch irgendwo anders.... thx
ich habe im Rahmen eines Frameworks eine Klasse ListenerHelper die von javax.swing.event.EventListenerList erbt. Sie ist quasi die Hilfsmethode um bei selbstdefinierten Datenklassen entsprechende Events zu der entsprechenden List hinzuzufügen.
In Java 1.4.2 sahen die add/remove Methoden, die die von EventListenerList überschrieben haben, so aus:
Code:
public synchronized void add(Class t, EventListener l) { .... }
public synchronized void remove(Class t, EventListener l) { .... }
Der Aufruf aus den Datenklassen sah zb so aus:
Code:
protected ListenerHelper m_lhListeners = new ListenerHelper();
...
public void addDataChangeListener(DataChangeListener scl) {
m_lhListeners.add(DataChangeListener.class, scl);
}
Hierbei gibt es eben für die Datenklassen immer auch entsprechende Listener.
Jetzt ist halt meine Aufgabe, dass ganze in Java 1.5 zum Laufen zu bringen.
Ohne irgendwas zu verändern bekomme ich die Fehlermeldung:
The method add(Class, EventListener) is ambiguous for the type ListenerHelper
Habe ich in der javadoc nachgeschaut, steht nun bei EventListenerList:
Code:
public <T extends EventListener> void add(Class<T> t, T l)
Also eine "generische" Parameterliste (oder wie man das auch immer genau bezeichnet).
Ändere ich jetzt meine Klasse in ListenerHelper<T> und passe die add/remove Methoden entsprechend der Signatur aus 1.5 an sind erstmal alle Fehler weg.
Leider aber bis auf einen. Denn innerhalb von ListenerHelper gibt es eine Methode die aus einer Datei die gespeicherten Werte ausliest. Das sind dann alles Objects. Mein Problem ist nun, die entsprechend im add-Methodenaufruf zu casten.
Die alte (1.4.2) Methode sieht so aus:
Code:
private void readObject(ObjectInputStream s) throws IOException, ClassNotFoundException {
s.defaultReadObject();
Object listenerTypeOrNull;
while (null != (listenerTypeOrNull = s.readObject())) {
EventListener l = (EventListener)s.readObject();
add(Class.forName((String)listenerTypeOrNull), l);
}
}
Der Fehler lautet da
Bound mismatch: The generic method add(Class<T>, T) of type EventListenerList is not applicable for the arguments (Class<capture-of ?>, EventListener). The inferred type capture-of ? is not a valid substitute for the bounded parameter <T extends EventListener>
Den EventListener bekomme ich ja hin, ein ein T anstelle des EventListener.
Aber wie caste ich jetzt das ausgelesene Object richtig? Ich weiss ja dass es entweder null ist oder irgendeine Klasse (entsprechend der Datenklassen) die von EventListener erbt. Ich probier da jetzt schon ne Weile rum, komme aber auf gar keinen grünen Zweig. Ist denn der Ansatz, die EventListenerList-Klasse als Generic zu machen sinnvoll/richtig? Vielleicht liegt der Fehler ja auch irgendwo anders.... thx