我在想下面的例子来说明为什么逆变是有用的。逆变的例子
让我们考虑一个带有Widgets
,Events
和Event 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
所有那些“添加监听器”的方法,而不会失去他们的类型安全。
它有道理吗?
+1好问题,不好的接受率。伤心! – Nishant 2011-03-18 14:04:34