2010-12-12 101 views
10

請看下面的例子:不能包含具有不同參數的相同接口?

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

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

這失敗,出現以下錯誤

/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 

但爲什麼呢?生成的方法沒有重疊。事實上,這實際上意味着

public interface AnotherInterface { 
    public void onEvent(JPanel event); 
    public void onEvent(JLabel event); 
} 

那裏沒有重疊。那麼爲什麼它失敗了?


如果你想知道我在做什麼,有一個更好的解決方案:我有一大堆的活動和一個監聽器的界面,幾乎完全一樣上面的Listener類。我想創建一個適配器和一個適配器接口,爲此我需要擴展所有的Listener接口和一個特定的事件。這可能嗎?有一個更好的方法嗎?

回答

10

不,你不能。 這是因爲泛型只支持編譯器級別。所以你不能這樣想,就像

public interface AnotherInterface { 
    public void onEvent(List<JPanel> event); 
    public void onEvent(List<JLabel> event); 
} 

或實現與幾個參數的接口。

UPD

我認爲解決方法將是這樣的:

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

啊,我忘記了類型擦除。你知道另一種方法來完成我想要做的事嗎? – TheLQ 2010-12-12 16:38:47

+0

@TheLQ,已更新。 – 2010-12-12 17:11:49

+0

@Stas每個事件看起來像是一噸代碼(〜50)。也許我應該回到顯式創建每個事件的偵聽器? – TheLQ 2010-12-12 17:22:53

3

不要忘記,在Java泛型使用類型錯誤實現,但擴展仍然編譯後。

你問那麼編譯器執行(後類型擦除是),

public interface AnotherInterface extends Listener, Listener; 

,你根本就做不到泛型與否。

+0

我忘了類型擦除。你知道一種替代方法來完成我想要完成的任務嗎? – TheLQ 2010-12-12 16:38:11

+0

'一級實現二,三{ } 接口其他 { } 接口兩個擴展其他 { } 接口擴展三個其他 { }' - 改變一個'Object'到其他任何東西,你會得到錯誤。所以,這不是因爲它擴展了界面,而且它必須專門用於泛型。 – Nicole 2011-10-13 02:55:22

相關問題