具有复杂泛型的 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
接口时会遇到麻烦。
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
接口时会遇到麻烦。