다음 예제를 사용하여 반공 진성이 유용한 이유를 설명하려고합니다.contavvariance의 예
GUI 프레임 워크를 Widgets
, Events
및 Event Listeners
으로 가정 해 보겠습니다. 하자 Widgets
abstract class Event;
class KeyEvent extends Event
class MouseEvent extends Event
trait EventListener[-E] { def listen(e:E) }
는 다음과 같은 방법을 정의
def addKeyEventListener(listener:EventListener[KeyEvent])
def addMouseEventListener(listener:EventListener[MouseEvent])
이 방법이 잘되는 만 "특정"이벤트 리스너에 동의합니다. 그러나 나는 또한 "kitchen-sink"청취자를 정의하고 싶습니다. 청취자는 모든 이벤트를 듣고 그러한 청취자를 위의 "청취자 추가"메소드에 전달합니다.
예를 들어, 나는 모든 들어오는 이벤트
class LogEventListener extends EventListener[Event] {
def listen(e:Event) { log(event) }
}
형질 EventListener
우리가 잃지 않고 모든 "리스너를 추가"방법에 LogEventListener
를 전달할 수 있습니다 Event
에서 contravariant 때문에
LogEventListener
를 정의하고자하는 그들의 타입 안전.
의미가 있습니까?
+1 좋은 질문, 나쁜 수용율. 슬퍼! – Nishant