不能包含不同参数的相同界面?

时间:2010-12-12 07:00:29

标签: java generics

考虑以下示例:

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接口。这可能吗?有更好的方法吗?

2 个答案:

答案 0 :(得分:10)

没有。你不能。 这是因为只在编译器级别支持泛型。所以你不能像

那样思考
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
}

答案 1 :(得分:4)

不要忘记,java泛型是使用类型errasure实现的,但扩展在编译后仍然存在。

那么你要求编译器做什么(在类型擦除之后),

public interface AnotherInterface extends Listener, Listener;

你根本不能做泛型。