Java 具有复杂泛型的SWT侦听器

Java 具有复杂泛型的SWT侦听器,java,generics,events,swt,listener,Java,Generics,Events,Swt,Listener,SWT版本:4.4 Java编译器:1.6 我正在尝试实现一个继承自FocusAdapter的侦听器。侦听器应该从一个控件复制到另一个控件,并且这些控件继承自SWT控件。您可以查看导入并实现MyControl的getValue、setValueT val接口 问题是它似乎无法识别泛型t类型,语法肯定有问题,但找不到问题所在 我知道您可以声明泛型类型,其中父类型可以是父类型或接口。您还可以使用&声明多个超类型 编辑:我按照安迪的建议做了。现在,关于listener类的新错误是: 请帮忙。 代码就在

SWT版本:4.4

Java编译器:1.6

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

问题是它似乎无法识别泛型t类型,语法肯定有问题,但找不到问题所在

我知道您可以声明泛型类型,其中父类型可以是父类型或接口。您还可以使用&声明多个超类型

编辑:我按照安迪的建议做了。现在,关于listener类的新错误是:

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

MyControl.java

CopyOnFocusListener.java


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

 abstract String windowClass();
因此,控件只能由org.eclipse.swt.widgets包中的另一个类扩展

传递给CopyOnFocusListener的泛型类需要扩展控件,但也需要实现MyControl类,我认为这正是让Eclipse感到不安的地方

您可能可以使用小部件代替控件扩展小部件

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


请注意,许多SWT控件对org.eclipse.SWT.widgets包之外的类进行特殊检查,试图扩展该类并引发异常。因此,将MyControl接口添加到这些控件时会遇到问题

声明类型变量:CopyOnFocusListenerWhat是MyControl。我猜MyControl是什么,编译时没有任何错误。@greg-449我为MyControl添加了代码。是一个非常简单的接口,正如我在最初的问题中所说的,但我认为您是对的代码可能会有帮助这对我来说仍然可以编译。@greg-449奇怪。您使用过org.eclipse.swt.widgets.Control吗???这是创建主要问题的类。
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);
    }
}
 abstract String windowClass();