Как я могу требовать аргумент метода в 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 так же хорошо, как я думаю... пустые интерфейсы по-прежнему добавляют уникальность выше и выше их суперинтерфейсов).

Самое близкое, что я могу придумать, - это выполнить одно из следующих действий:

  1. выберите один интерфейс (например, Appendable) и используйте тесты во время выполнения, чтобы убедиться, что аргумент является instanceof другие. Недостаток: проблема не обнаружена во время компиляции.

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

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

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

Другие вопросы по тегам