Как я могу потребовать аргумент метода в 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 другими. Недостаток: проблема не была обнаружена во время компиляции.

  • требуется несколько аргументов (улавливает правильность времени компиляции, но выглядит dorky):

    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();
}

На самом деле ваш синтаксис был практически прав.