我在想下面的例子來說明爲什麼逆變是有用的。逆變的例子
讓我們考慮一個帶有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