- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
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
(监听哪种类型的事件),以及 EventHandler
。 EventHandler
出于显而易见的原因是通用的:通过定义 EventHandler<T extends Event>
你可以定义一个 handle(T event)
方法接受适当的事件对象,然后您可以以特定于类型的方式查询该事件对象。 (例如 EventHandler<MouseEvent>
有一个 handle(MouseEvent event)
方法,可以查询鼠标坐标等)。
现在,显然只有注册 EventHandler<T>
才有意义。对于 EventType
与Event
相关联子类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>
,因此 e
是 MouseEvent
。所以编译器现在可以推断出
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/
我是一名优秀的程序员,十分优秀!