2009-09-30 87 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(); 
} 

我想,如果有可能迫使呼叫者使用既是對象可附加和可關閉,無需特定類型。有多種標準類別可以做到這一點,例如但是BufferedWriter,爲PrintStream等

如果我定義我自己的接口

interface AppendableAndCloseable extends Appendable, Closeable {} 

因爲實現可追加和關閉,沒有實現我的接口AppendableAndCloseable(除非我不明白的標準類,將無法正常工作Java以及我認爲我做...空接口仍然增加超越其超接口以上的唯一性)。

我能想到的最接近的是做下列之一:

  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

啊哈!歡呼! :-) –

+0

這是否也適用於工具?我試圖讓一個參數對象必須是可串行化的? – Zapnologica

+1

@Zapnologica:爲了實現一個接口?不,您不能對接口中聲明的泛型參數進行額外的類型限制。 –

相關問題