53

Java でこれを行うことは合法です。

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

どうすればこれを行うことができますか (構文は合法ではありません):

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

可能であれば、特定のタイプを必要とせずに、呼び出し元に追加可能とクローズ可能の両方のオブジェクトを使用するように強制したいと思います。BufferedWriter、PrintStream など、これを行う複数の標準クラスがあります。

独自のインターフェースを定義する場合

 interface AppendableAndCloseable extends Appendable, Closeable {}

Appendable と Closeable を実装する標準クラスは私のインターフェイス AppendableAndCloseable を実装していないため、これは機能しません (私が思っているほど Java を理解していない場合を除きます...空のインターフェイスは、スーパーインターフェイスの上とそれを超えて一意性を追加します)。

私が考えることができる最も近いのは、次のいずれかを行うことです。

  1. 1 つのインターフェイス (例: 追加可能) を選択し、実行時テストを使用して引数がinstanceof他のものであることを確認します。欠点: コンパイル時に問題が検出されない。

  2. 複数の引数が必要です (コンパイル時の正確さをキャッチしますが、見た目はおかしくなります):

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

1 に答える 1

86

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

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

実際、あなたの構文はほぼ正しいものでした。

于 2009-09-30T22:00:34.077 に答える