考虑以下示例:
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); }
那里没有重叠。那为什么会失败呢?
如果您想知道我在做什么,并且有更好的解决方案:我有一堆Event和Listener接口,它们几乎与上述Listener类完全一样。我想创建一个适配器和一个适配器接口,为此,我需要使用特定事件扩展所有Listener接口。这可能吗?有一个更好的方法吗?
Listener
不,你不能。这是因为泛型仅在编译器级别受支持。所以你不能像
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 }