Это законно для этого в 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, не реализуют мой интерфейс AppendableAndCloseable (если я не понимаю Java, как и я думаю, что я... пустые интерфейсы все еще добавляют уникальность выше и выше их суперинтерфейсы).
Ближайшим, о котором я могу думать, является одно из следующих:
-
выберите один интерфейс (например, Appendable) и используйте тесты времени выполнения, чтобы аргумент был
instanceof
другими. Недостаток: проблема не была обнаружена во время компиляции. -
требуется несколько аргументов (улавливает правильность времени компиляции, но выглядит dorky):
void spew(Appendable xAppend, Closeable xClose) { xAppend.append("Bleah!\n"); if (timeToClose()) xClose.close(); }