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

55

在Java中,这样做是合法的:

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

我该如何做到这一点(语法不合法):

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

如果可能的话,我想强制调用者使用既是Appendable又是Closeable的对象,而不需要指定特定类型。有多个标准类可以做到这一点,例如BufferedWriter、PrintStream等。

如果我定义自己的接口

 interface AppendableAndCloseable extends Appendable, Closeable {}

由于实现Appendable和Closeable标准类并没有实现我定义的接口AppendableAndCloseable(除非我对Java的理解不如我想象的那么好...即使是空接口,它们仍然超越其超级接口而具有独特性),所以这样做行不通。

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

  1. 选择一个接口(例如Appendable),并使用运行时测试来确保参数是其他接口的instanceof。 缺点:问题无法在编译时捕获。

  2. 需要多个参数(可以在编译时捕获错误,但看起来很笨拙):

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

1
确实有点不足。但是你的问题具体是什么? - NawaMan
1个回答

87
你可以使用泛型来实现这个功能:
public <T extends Appendable & Closeable> void spew(T t){
    t.append("Bleah!\n");
    if (timeToClose())
        t.close();
}

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


这对实现也适用吗?我正在尝试使参数对象必须是可序列化的。 - Zapnologica
1
@Zapnologica:用于实现接口?不,您不能对在接口中声明的泛型参数添加其他类型限制。 - Michael Myers

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接