如何在Java中需要一个方法参数来实现多个接口?

如何在Java中需要一个方法参数来实现多个接口?,java,oop,multiple-inheritance,Java,Oop,Multiple Inheritance,在Java中这样做是合法的: void spew(Appendable x) { x.append("Bleah!\n"); } 如何执行此操作(语法不合法): 如果可能,我希望强制调用方使用既可追加又可关闭的对象,而不需要特定类型。有多个标准类可以这样做,例如BufferedWriter、PrintStream等 如果我定义自己的接口 interface AppendableAndCloseable extends Appendable, Closeable {} 这是行

在Java中这样做是合法的:

 void spew(Appendable x)
 {
     x.append("Bleah!\n");
 }
如何执行此操作(语法不合法):

如果可能,我希望强制调用方使用既可追加又可关闭的对象,而不需要特定类型。有多个标准类可以这样做,例如BufferedWriter、PrintStream等

如果我定义自己的接口

 interface AppendableAndCloseable extends Appendable, Closeable {}
这是行不通的,因为实现appendeable和Closeable的标准类没有实现我的接口appendeable和Closeable(除非我没有像我想的那样理解Java…空接口仍然在它们的超级接口之上和之外添加唯一性)

我能想到的最接近的方法是执行以下操作之一:

  • 选择一个接口(例如Appendable),并使用运行时测试确保参数是其他接口的
    实例。缺点:编译时未捕获问题

  • 需要多个参数(捕获编译时的正确性,但看起来有问题):


  • 您可以使用泛型实现这一点:

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

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

    这肯定是不正确的。但你的问题到底是什么呢?这也适用于工具吗?我正在尝试使参数对象必须是可序列化的?@Zapnologica:用于实现接口?不,不能对在接口中声明的泛型参数设置其他类型限制。
    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();
    }