2010-12-12 5 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

+0

@TheLQを更新しました。 –

+0

@Stasこれはイベントごとに1トンのコード(〜50)のようです。イベントごとにリスナーを明示的に作成する必要があるかもしれません。 – TheLQ

3

Javaジェネリックではタイプエラサールを使用して実装されていますが、コンパイル後は拡張子が残っていることを忘れないでください。

あなたは、単にジェネリックを行うかをすることはできませんので、どのような(型消去された後)あなたがするコンパイラを求めている、

public interface AnotherInterface extends Listener, Listener; 

+0

私は型消去を忘れてしまいました。私が達成したいことを達成する別の方法を知っていますか?変更1 'Object' - – TheLQ

+0

'クラスの一つは、2つ、3 { } インターフェース他 { } インタフェース2つは他 { } インターフェース三その他 { を} '延びて延びて実装しますそれ以外のものはエラーになります。したがって、それはインターフェイスを二重に拡張しているわけではなく、ジェネリックスを使って具体的に行う必要があります。 – Nicole

関連する問題