2010-12-12 7 views
10

Betrachten Sie das folgende Beispiel:Kann dieselbe Schnittstelle nicht mit anderen Parametern verbunden sein?

public class Sandbox { 
    public interface Listener<T extends JComponent> { 
     public void onEvent(T event); 
    } 

    public interface AnotherInterface extends Listener<JPanel>, Listener<JLabel> { 
    } 
} 

Dies schlägt mit dem folgenden Fehler

/media/PQ-WDFILES/programming/Sandbox/src/Sandbox.java:20: Sandbox.Listener cannot be inherited with different arguments: <javax.swing.JPanel> and <javax.swing.JLabel> 
     public interface AnotherInterface extends Listener<JPanel>, Listener<JLabel> { 
      ^
1 error 

Warum aber? Es gibt keine Überlappung in den generierten Methoden. In der Tat bedeutet das im Wesentlichen

Keine Überlappung dort. Warum scheitert es?


Wenn Ihr fragen, was ich tue und eine bessere Lösung haben: Ich habe eine Reihe von Veranstaltungen und eine Listener-Schnittstelle, die wie die Listener Klasse über fast genau ist. Ich möchte einen Adapter und eine Adapterschnittstelle erstellen, und dazu muss ich alle Listener-Schnittstellen um ein bestimmtes Ereignis erweitern. Ist das möglich? Gibt es einen besseren Weg, dies zu tun?

Antwort

10

Nein. Sie können nicht. Es ist weil Generics nur auf Compiler-Ebene unterstützt werden. So kann man nicht denken wie

oder implementiert Schnittstelle mit mehreren Parametern.

upd

denke ich Abhilfe wird so sein:

public class Sandbox { 
// .... 
    public final class JPanelEventHandler implements Listener<JPanel> { 
     AnotherInterface target; 
     JPanelEventHandler(AnotherInterface target){this.target = target;} 
     public final void onEvent(JPanel event){ 
      target.onEvent(event); 
     } 
    } 
///same with JLabel 
} 
+0

Ah, ich habe vergessen, Art zu löschen. Kennen Sie einen alternativen Weg, um das zu erreichen, was ich tun möchte? – TheLQ

+0

@TheLQ, aktualisiert. –

+0

@Stas Das scheint wie eine Tonne Code pro Ereignis (~ 50). Vielleicht sollte ich einfach zum expliziten Erstellen eines Listeners pro Ereignis zurückkehren? – TheLQ

3

Vergessen Sie nicht, dass Generika in Java mit dem Typ errasure implementiert werden, die Erweiterung bleibt jedoch nach der Kompilierung erhalten.

Also, was Sie den Compiler (nach Typ Löschung ist), zu tun, fragen

public interface AnotherInterface extends Listener, Listener; 

, die man einfach nicht Generika tun kann oder nicht.

+0

habe ich vergessen Typ Löschung. Kennen Sie einen alternativen Weg, um das zu erreichen, was ich erreichen möchte? – TheLQ

+0

'Klasse One implementiert zwei, drei { } Schnittstelle Andere { } Schnittstelle Zwei erweitert Andere { } Schnittstelle Drei erweitert Andere { }' - Ändern Sie eine 'Object' zu allem anderen und du bekommst den Fehler. Es liegt also nicht daran, dass es die Schnittstelle doppelt erweitert, sondern speziell mit Generics. – Nicole

Verwandte Themen