Не можете включить один и тот же интерфейс с разными параметрами? - PullRequest
10 голосов
/ 12 декабря 2010

Рассмотрим следующий пример:

public class Sandbox {
    public interface Listener<T extends JComponent> {
        public void onEvent(T event);
    }

    public interface AnotherInterface extends Listener<JPanel>, Listener<JLabel> {
    }
}

Это происходит со следующей ошибкой

/media/PQ-WDFILES/programming/Sandbox/src/Sandbox.java:20: Sandbox.Listener cannot be inherited with different arguments: <javax.swing.JPanel> and <javax.swing.JLabel>
        public interface AnotherInterface extends Listener<JPanel>, Listener<JLabel> {
               ^
1 error

Почему, хотя? В сгенерированных методах нет совпадений. На самом деле, это по сути означает

public interface AnotherInterface {
    public void onEvent(JPanel event);
    public void onEvent(JLabel event);
}

Никаких совпадений. Так почему же это не получается?


В случае, если вам интересно, что я делаю, и у меня есть лучшее решение: у меня есть куча событий и интерфейс слушателя, который почти в точности похож на класс Listener выше. Я хочу создать адаптер и интерфейс адаптера, и для этого мне нужно расширить все интерфейсы слушателя определенным событием. Это возможно? Есть ли лучший способ сделать это?

Ответы [ 2 ]

10 голосов
/ 12 декабря 2010

Нет.Вы не можете.Это потому, что дженерики поддерживаются только на уровне компилятора.Так что вы не можете думать как

public interface AnotherInterface {
    public void onEvent(List<JPanel> event);
    public void onEvent(List<JLabel> event);
}

или реализует интерфейс с несколькими параметрами.

upd

Я думаю, что обходной путь будет таким:

public class Sandbox {
//    ....
    public final class JPanelEventHandler implements Listener<JPanel> {
        AnotherInterface target;
        JPanelEventHandler(AnotherInterface target){this.target = target;}
        public final void onEvent(JPanel event){
             target.onEvent(event);
        }
    }
///same with JLabel
}
4 голосов
/ 12 декабря 2010

Не забывайте, что в java-шаблонах реализовано использование типа errasure, но расширение остается после компиляции.

Итак, что вы просите компилятору (после стирания типа),

public interface AnotherInterface extends Listener, Listener;

, который вы просто не можете сделать дженерики или нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...