gpt4 book ai didi

scala - 逆变的例子

转载 作者:行者123 更新时间:2023-12-02 05:21:09 24 4
gpt4 key购买 nike

我正在考虑下面的例子来说明为什么逆变是有用的。

让我们考虑一个带有 WidgetsEventsEvent Listeners 的 GUI 框架。

abstract class Event;
class KeyEvent extends Event
class MouseEvent extends Event

trait EventListener[-E] { def listen(e:E) }

Widgets定义以下方法:

def addKeyEventListener(listener:EventListener[KeyEvent])
def addMouseEventListener(listener:EventListener[MouseEvent])

这些方法仅接受“特定”事件监听器,这很好。不过,我还想定义“厨房水槽”监听器,它监听所有事件,并将此类监听器传递给上面的“添加监听器”方法。

例如,我想定义 LogEventListener 来记录所有传入事件

class LogEventListener extends EventListener[Event] {
def listen(e:Event) { log(event) }
}

由于 EventListener 特征在 Event 中是逆变,我们可以将 LogEventListener 传递给所有那些“添加监听器”方法而不失去其类型安全性。

有意义吗?

最佳答案

无论如何,这对我来说是有道理的。这也是我见过的最直观的例子之一:监听所有事件的东西自然会监听按键事件或鼠标事件。

关于scala - 逆变的例子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5351899/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com