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