2010-12-12 20 views
10

Rozważmy następujący przykład:Nie może zawierać tego samego interfejsu o różnych parametrach?

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

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

to się nie powiedzie z powodu następującego błędu

/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 

Dlaczego mimo? W generowanych metodach nie ma nakładania się. W rzeczywistości oznacza to w istocie, że nie ma tam nakładania się. Dlaczego to się nie udaje?


W przypadku, gdy zastanawiasz się, co robię i mam lepsze rozwiązanie: Mam kilka zdarzeń i interfejs Listener, który jest prawie dokładnie tak, jak w klasie Listener powyżej. Chcę utworzyć adapter i interfejs adaptera, a do tego potrzebuję rozszerzyć wszystkie interfejsy Listener o określone zdarzenie. czy to możliwe? Czy jest lepszy sposób to zrobić?

Odpowiedz

10

Nie. Nie możesz. Dzieje się tak, ponieważ leki generyczne są obsługiwane tylko na poziomie kompilatora. Nie można więc tak myśleć, jak np. lub implementować interfejs z kilkoma parametrami.

UPD

myślę obejście będzie tak:

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

Ach, zapomniałem o wymazaniu czcionki. Czy znasz alternatywny sposób osiągnięcia tego, co chcę zrobić? – TheLQ

+0

@TheLQ, zaktualizowany. –

+0

@Stas Wydaje się to toną kodu na zdarzenie (~ 50). Być może powinienem wrócić do wyraźnego tworzenia słuchaczy na wydarzenie? – TheLQ

3

Nie zapominaj, że w java generics są implementowane za pomocą typu errasure, ale rozszerzenie pozostaje po kompilacji.

Więc o co prosicie kompilator zrobić (po skasowaniu jest typ),

public interface AnotherInterface extends Listener, Listener; 

których po prostu nie można zrobić rodzajowych czy nie.

+0

zapomniałem o typ skasowaniem. Czy znasz alternatywny sposób osiągnięcia tego, co chcę osiągnąć? – TheLQ

+0

'Jedna klasa implementuje dwa, trzy { } Interfejs Inny { } interfejs Dwa rozciąga Inne { } interfejs Trzy rozciąga Inne { }' - 'Object' zmienić jedną do czegokolwiek innego, a otrzymasz błąd. Nie dlatego, że rozszerza interfejs w dwóch egzemplarzach i ma to w szczególności związek z produktem Generics. – Nicole

Powiązane problemy