Не можете включить один и тот же интерфейс с разными параметрами?
Рассмотрим следующий пример:
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, который почти точно соответствует классу Listener
выше. Я хочу создать адаптер и интерфейс адаптера, и для этого мне нужно расширить все интерфейсы Listener с определенным событием. Это возможно? Есть ли лучший способ сделать это?
Ответы
Ответ 1
Нет. Вы не можете.
Это потому, что generics поддерживаются только на уровне компилятора. Поэтому вы не можете думать, как
public interface AnotherInterface {
public void onEvent(List<JPanel> event);
public void onEvent(List<JLabel> event);
}
или реализует интерфейс с несколькими параметрами.
обн
Я думаю, что обходное решение будет таким:
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
}
Ответ 2
Не забывайте, что в java generics реализованы с использованием типа errasure, но расширение остается после компиляции.
Итак, что вы просите у компилятора (после стирания стилей),
public interface AnotherInterface extends Listener, Listener;
который вы просто не можете делать дженериками или нет.