Java FX-8 : Why is EventType generic?

标签 java events generics javafx-8

JavaFX 中的 EventType 系统非常困惑。 我认为这样做的原因是设计师决定让 EventType 类本身是通用的。

这有什么实际用途还是这只是一些 确保类型安全的模糊形式?

我想只有当泛型类型返回到调用类的某个地方时,类才会成为泛型。否则还有什么意义?

最佳答案

Event类,即 Event 的子类,为该类定义特定方法。例如。 MouseEvent定义了事件发生时可用于查询鼠标坐标的各种方法( getX()getY()getSceneX()getScreenX() 等); ScrollEvent定义了查询滚动量和方向的方法:getDeltaX() , getDeltaY()等)。

EventType是一个更细粒度的对象,指定发生了什么。所以常数EventType类包括MOUSE_CLICKED , MOUSE_PRESSED , KEY_TYPED , SCROLL_STARTED等等。每个值都与特定的 Event 相关联。子类。

Activity 报名方式为addEventHandler(...) 。此方法采用两个参数:EventType (监听哪种类型的事件),以及 EventHandlerEventHandler出于显而易见的原因是通用的:通过定义 EventHandler<T extends Event>你可以定义一个 handle(T event)方法接受适当的事件对象,然后您可以以特定于类型的方式查询该事件对象。 (例如 EventHandler<MouseEvent> 有一个 handle(MouseEvent event) 方法,可以查询鼠标坐标等)。

现在,显然只有注册 EventHandler<T> 才有意义。对于 EventTypeEvent相关联子类T 。此外,最好允许编译器强制执行此操作。通过制作 EventType通用类:EventType<T extends Event> ,我们让编译器强制执行这个规则。 MOUSE_CLICKED不仅仅是 EventType 的一个实例,它是 EventType<MouseEvent> 的一个实例。自签名addEventHandler(...)方法是addEventHandler(EventType<T>, EventHandler<T>) ,编译器强制处理程序与事件类型“针对同一类事件”。

当你将其与 lambda 结合使用(或者我认为特别是类型推断)时,它会变得非常强大:

node.addEventHandler(MOUSE_CLICKED, e -> {...});

因为MOUSE_CLICKED具体来说是 EventType<MouseEvent> ,编译器能够推断 lambda 定义的事件处理程序是 EventHandler<MouseEvent> ,因此 eMouseEvent 。所以编译器现在可以推断出

node.addEventHandler(MOUSE_CLICKED, e -> System.out.println(e.getX()));
node.addEventHandler(KEY_TYPED, e -> System.out.println(e.getText()));

是合法的,但是

node.addEventHandler(MOUSE_CLICKED, e -> System.out.println(e.getText()));

不是。如果EventType不是通用的,这是不可能的。

(没有 lambda 也是如此,但不太简洁的语法也无法说明问题。但是如果 EventType 不是通用的,编译器就无法拒绝

node.addEventHandler(MOUSE_CLICKED, new EventHandler<KeyEvent>() {
    @Override
    public void handle(KeyEvent event) { }
});

再说一遍,事实上 MOUSE_CLICKED类型为EventType<MouseEvent>意味着这不会编译。)

从技术上讲,EventType用作“运行时类型 token ”。它不仅用于说明我们对哪些事件感兴趣,还用于说明应使用哪种类型的事件处理程序来处理该事件。使用泛型的其他示例包括 Class<T> :参见this part of the Java tutorial进行简短的讨论。

关于Java FX-8 : Why is EventType generic?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26807796/

相关文章:

jQuery mousemove 性能 - 节流事件?

java - 原始类型将 super 传递给 sub

java - 求助理解Java Reflection --> Android ParcelableContainer

.NET 错误 : ldtoken of an instantiated generic method

java - 从 GoogleCredentials 获取 applicationDefault

java - 尝试用 Java 发送电子邮件时出现连接异常

Java:即使设置了 `setVerticalScrollBarPolicy` 和其他选项,滚动条也不会出现

JQuery live 或与 .change() 类似的东西?

javascript 类实例处理事件不一致 - this/范围界定困惑

java - 具有共同偏好的不当行为