如何在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的对象,而不需要特定的types。 有多个标准类可以做到这一点,例如BufferedWriter,PrintStream等

如果我定义我自己的界面

  interface AppendableAndCloseable extends Appendable, Closeable {} 

这将不起作用,因为实现Appendable和Closeable的标准类不会实现我的接口AppendableAndCloseable(除非我不了解Java以及我认为的…空接口仍然增加超越其超接口的唯一性)。

我能想到的最接近的是做下面的一个:

  1. select一个接口(例如Appendable),并使用运行时testing来确保参数是其他instanceof 。 下行:编译时没有发现问题。

  2. 需要多个参数(捕获编译时正确性,但看起来很傻):

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

你可以用generics来做到这一点:

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

实际上,你的语法几乎是正确的。