在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的标准类没有实现我的接口(interface)AppendableAndCloseable,所以这是行不通的(除非我不像我一样理解Java,空接口(interface)仍然在其超接口(interface)之上和之外增加了唯一性)。

我能想到的最接近的方法是执行以下操作之一:
  • 选择一个接口(interface)(例如Appendable),并使用运行时测试来确保该参数是另一个接口(interface)的instanceof。缺点:在编译时未发现问题。
  • 需要多个参数(捕获编译时正确性,但看起来很笨拙):
    void spew(Appendable xAppend, Closeable xClose)
    {
        xAppend.append("Bleah!\n");
        if (timeToClose())
            xClose.close();
    }
    
  • 最佳答案

    您可以使用泛型:

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

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

    07-24 09:39
    查看更多