具有复杂泛型的 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<T, C extends Control & MyControl<T>>
什么是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 侦听器的主要内容,如果未能解决你的问题,请参考以下文章