Вывод типа, включающий возвращаемый тип, подстановочный знак и тип пересечения

Я пытаюсь объявить интерфейс, содержащий метод, который вернет список вещей, реализующих оба Comparator и Action , т.е.

<T extends Comparator<Object> & Action> List<T> getThings();

Компилируется нормально, но проблема возникает, когда я пытаюсь вызвать этот метод. Я хочу иметь возможность сделать это:

List<Action> things = getThings();
List<Comparator<Object>> things = getThings();

Когда я пытаюсь сделать это, я получаю следующую ошибку компиляции:

 incompatible types; no instance(s) of type variable(s) T exist so that
 java.util.List<T> conforms to java.util.List<javax.swing.Action>
 found   : <T>java.util.List<T>
 required: java.util.List<javax.swing.Action>

Следующее тоже не работает:

List<? extends Action> things = getThings();
List<? extends Comparator<Object>> things = getThings();

Другой способ добиться этого эффекта - создать пустой интерфейс, расширяющий как Comparator , так и Action и использующий его как возвращаемый тип, т.е.

public interface ComparatorAction extends Comparator<Object>, Action { }
List<ComparatorAction> getThings();

Но я не хочу этого делать. Должен же быть способ делать то, что я хочу, верно? Есть идеи?

Спасибо!

P.S. Мне сложно придумать хорошее название для этой публикации, поэтому не стесняйтесь его менять.

10
задан irreputable 22 June 2011 в 17:25
поделиться