Wieder einmal Probleme mit Java Generics

DarthShader

Erfahrenes Mitglied
Hallo zusammen,

ich werde mal wieder wahnsinnig was Java Generics angeht - ich glaube irgendwas Entscheidendes fehlt mir, um die Dinger komplett zu verstehen (das war jetzt keine Einladung für Vorschläge ;) ), obwohl ich schon etliche male über das Thema gelesen habe.

Ich habe hier ein einfaches Interface und eine einfache Klasse:

Java:
public interface EventDispatcher<T extends EventListener> {
	public void dispatchEvent(T eventListener);
}


Java:
public class EventSupport {
	
	private List<EventListener>	eventListeners	= new ArrayList<EventListener>();

	public <T extends EventListener> void fireEvent(EventDispatcher<T> eventDispatcher) {
		EventListener eventListener = eventListeners.get(0);	// Nur hier fürs Beispiel immer der erste
		eventDispatcher.dispatchEvent(eventListener);			// Compiler-Fehler (1)
	}
}

Dieser Code kompiliert nicht, an der Stelle (1) erscheint folgende Fehlermeldung:

Java:
// Compiler-Fehler (1)

The method dispatchEvent(T) in the type EventDispatcher<T> is not applicable
for the arguments (EventListener)


Ich verstehe leider nicht, warum dieser Fehler auftritt. Ich hätte gedacht, dass ich im Interface klar mache, dass der Parameter für "dispatchEvent" vom Typ "EventObject oder irgendwas davon abgeleitet" ist ("T extends EventObject"). Aber es kommt trotzdem der Fehler, obwohl ich ihm bei (1) ein Parameter ("eventListener") vom Typ "EventListener" mitgebe.

Ich würde mich wirklich sehr freuen, wenn mir jemand erklären könnte, warum dieser Fehler auftritt bzw. was ich hier falsch mache.


Vielen Dank!
 
Hallo,

schau dir mal das Pecs Prinzip an:
http://devender.files.wordpress.com/2008/05/effectivejava.pdf
http://stackoverflow.com/questions/2723397/java-generics-what-is-pecs

Java:
package de.tutorials.training;

import java.util.EventListener;

public interface EventDispatcher<T extends EventListener> {
    public void dispatchEvent(T eventListener);
}

Java:
package de.tutorials.training;

import java.util.ArrayList;
import java.util.EventListener;
import java.util.List;

public class EventSupport {
    
    private List<EventListener> eventListeners  = new ArrayList<EventListener>();
 
    public void fireEvent(EventDispatcher<? super EventListener> eventDispatcher) {
        EventListener eventListener = eventListeners.get(0);  
        eventDispatcher.dispatchEvent(eventListener);
    }
}

... der Sinn von deinem Codebeispiel ergibt sich mir aber noch nicht so ganz...

Gruß Tom
 
Hallo Thomas,

vielen Dank für Deine Hilfe und Sorry für meine späte Antwort. Den Vortag über PECS habe ich mir vor einiger Zeit bereits mal auf Parleys angesehen - anscheinend hätte mehr davon hängen bleiben sollen ;)


... der Sinn von deinem Codebeispiel ergibt sich mir aber noch nicht so ganz...
Gruß Tom

Also das ist eher experimentell gerade. Der Hintergrund ist, dass mir das normale Observer/Listener Pattern gestört hat: ListenerList, fireXXEvent Methoden, iterieren über alle Listener und Aufrufen der richtigen Methode etc.

Da wollte ich mal schauen, ob man es nicht einfacher machen kann, damit man nicht ständig diesen Boilerplate-Code schreiben muss, nur damit eine Klasse Events unterstützt. Die fireXXXEvent Methoden zu schreiben ist ja ok, aber schön wäre es, wenn dann z.B. nur noch einen Einzeiler o.Ä. enthalten.
 

Neue Beiträge

Zurück