具有复杂泛型的 SWT 侦听器

Posted

技术标签:

【中文标题】具有复杂泛型的 SWT 侦听器【英文标题】:SWT Listener with complex generics 【发布时间】:2017-12-18 20:12:32 【问题描述】:

SWT 版本:4.4

Java 编译器:1.6

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

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

我知道你可以声明一个泛型类型,其中 SuperType 可能是父类或接口。你也可以用 & 声明多个超类型。

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

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

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);
    

【问题讨论】:

声明类型变量:CopyOnFocusListener&lt;T, C extends Control &amp; MyControl&lt;T&gt;&gt; 什么是MyControl。编译这个我没有得到任何错误(猜测 MyControl 是什么)。 @greg-449 我为 MyControl 添加了代码。正如我在原始问题中所说,是一个非常简单的界面,但我认为您是对的,代码可能会有所帮助 这对我来说仍然可以编译。 @greg-449 奇怪。你用过org.eclipse.swt.widgets.Control吗???这是创建主要问题的类。 【参考方案1】:

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

 abstract String windowClass();

所以Control 只能被org.eclipse.swt.widgets 包中的另一个类扩展。

您传递给CopyOnFocusListener 的泛型类需要扩展Control,但还需要实现您的MyControl 类,我认为这是让Eclipse 感到不安的原因。

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

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

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

【讨论】:

以上是关于具有复杂泛型的 SWT 侦听器的主要内容,如果未能解决你的问题,请参考以下文章

多个 swt 按钮,相同的侦听器 [重复]

向 SWT.MouseUp 的 Shell 添加侦听器不起作用

将鼠标侦听器添加到 java swt 图像

如何更改 SWT 进度条的颜色?

在 shell 最大化按钮 swt 上添加监听器

Eclipse SWT 中用于循环组合的 Java 侦听器