在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)之上和之外增加了唯一性)。
我能想到的最接近的方法是执行以下操作之一:
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();
}
实际上,您的语法几乎是正确的。