2009-09-30 4 views
46

これはJavaでこれを行うには、法的です:私はこの(ない法的な構文)を行うことができますどのように複数のインターフェイスを実装するには、Javaでメソッド引数を要求することはできますか?

void spew(Appendable x) 
{ 
    x.append("Bleah!\n"); 
} 

void spew(Appendable & Closeable x) 
{ 
    x.append("Bleah!\n"); 
    if (timeToClose()) 
     x.close(); 
} 

可能な場合は、両方のオブジェクトを使用するために発信者を強制的に私は希望特定のタイプを必要とせずに、AppendableおよびCloseable。これを行う複数の標準クラスがあります。などBufferedWriterの、PrintStreamを、

私は理解していない場合を除き追加可と閉鎖可能を実装する標準クラスは私のインターフェイスAppendableAndCloseableを(実装していないので、動作しません私自身のインタフェース

interface AppendableAndCloseable extends Appendable, Closeable {} 

を定義した場合Javaだけでなく、私がやっていると思うのですが...空のインターフェイスは依然としてスーパーインターフェイスの上と外に一意性を追加します)。私は考えることができる最も近い次のいずれかを行うことです

  1. 1つのインタフェース(例えば、追加可)を選択し、引数がinstanceof他人であることを保証するために、ランタイムテストを使用します。欠点:コンパイル時に問題が検出されない。

  2. は(漁獲量が正確コンパイル時が、役立たずに見える)複数の引数が必要です。

    void spew(Appendable xAppend, Closeable xClose) 
    { 
        xAppend.append("Bleah!\n"); 
        if (timeToClose()) 
         xClose.close(); 
    } 
    
+1

これは確かに欠けています。しかし、あなたの質問は何ですか? – NawaMan

答えて

78

あなたはジェネリックでそれを行うことができます:

public <T extends Appendable & Closeable> void spew(T t){ 
    t.append("Bleah!\n"); 
    if (timeToClose()) 
     t.close(); 
} 

あなたの構文はほとんど正しかったです実際、

+0

aha!ハレイ! :-) –

+0

これは実装にも同様に機能しますか?私は、パラメータオブジェクトを作成しようとしていますserialzableする必要がありますか? – Zapnologica

+1

@ Zapnologica:インタフェースを実装するには?いいえ、インタフェースで宣言された汎用パラメータに追加の型制限を付けることはできません。 –

関連する問題