具有复杂泛型的 SWT 侦听器

SWT Listener with complex generics

SWT 版本: 4.4

Java 编译器: 1.6

我正在尝试实现我的一个继承自 FocusAdapter 的侦听器。侦听器应该从一个控件复制到另一个控件,控件继承自 SWT Control(您可以查看导入)并实现 MyControl(getValue()、setValue(T val) 接口)。

问题是它似乎无法识别泛型 T 类型,语法一定有问题,但找不到什么。

我知道您可以声明一个通用类型,其中 SuperType 可以是父类或接口。您也可以使用 &.

声明多个超类型

编辑:我按照安迪的建议做了。现在关于监听器的新错误 class 说:

请帮忙。 代码就在下面。提前致谢。

MyControl.java

public interface MyControl<T> {
    T getValue();

    void setValue(T value);

    void resetValue();
}

CopyOnFocusListener.java

import org.eclipse.swt.events.FocusAdapter;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.widgets.Control;

// This was the former, original question
//public class CopyOnFocusListener<C extends Control & MyControl<T>> extends FocusAdapter {

public class CopyOnFocusListener<T, C extends Control & MyControl<T>> extends FocusAdapter {

    private final C fromControl;
    private final C toControl;


    public CopyOnFocusListener(final C fromControl,
            final C toControl) {
        super();
        this.fromControl = fromControl;
        this.toControl = toControl;
        fromControl.addFocusListener(this);
    }


    @Override
    public void focusLost(final FocusEvent event) {
        final T fromValue = fromControl.getValue();
        toControl.setValue(fromValue);
    }
}

我不确定 Eclipse 生成特定消息的确切原因,但问题是在某些平台上 Control 有一个包私有抽象方法 - 类似于:

 abstract String windowClass();

因此 Control 只能由 org.eclipse.swt.widgets 包中的另一个 class 扩展。

您要传递给 CopyOnFocusListener 的通用 class 需要扩展 Control 但还要实现您的 MyControl class,我认为这就是令 Eclipse 心烦意乱。

您可以使用 Widget 代替 Control(控件扩展小部件)。

我的系统上没有收到此错误消息,因为 Control 的 macOS 版本没有 windowClass 方法。

请注意,许多 SWT 控件对 org.eclipse.swt.widgets 包之外的 class 进行了特殊检查,试图扩展 class 并抛出异常。所以你在给这些控件添加MyControl接口时会遇到麻烦。