많은 것들이 불가능하지 않습니다.당신은 타입 클래스로, 예를 들어, 다음과 같은 작업을 수행 할 수 있습니다 지금
class HMultiMap {
import scala.collection.mutable.{ Buffer, HashMap }
type Mapping[K, V]
private[this] val underlying = new HashMap[Any, Buffer[Any]]
def apply[K, V](key: K)(implicit ev: Mapping[K, V]) =
underlying.getOrElse(key, Buffer.empty).toList.asInstanceOf[List[V]]
def add[K, V](key: K)(v: V)(implicit ev: Mapping[K, V]) = {
underlying.getOrElseUpdate(key, Buffer.empty) += v
this
}
}
과 :
sealed trait EventObject
case class KeyEventObject(c: Char) extends EventObject
case class MouseEventObject(x: Int, y: Int) extends EventObject
sealed trait EventDescriptor
case object KEY_EVENT extends EventDescriptor
case object MOUSE_EVENT extends EventDescriptor
class EventMap extends HMultiMap {
class Mapping[K, V]
object Mapping {
implicit object k extends Mapping[KEY_EVENT.type, KeyEventObject => Unit]
implicit object m extends Mapping[MOUSE_EVENT.type, MouseEventObject => Unit]
}
}
을 조금 지저분하지만 사용이 훨씬 예뻐이다 :
val eventListeners = new EventMap
eventListeners.add(KEY_EVENT)((e: KeyEventObject) => println(e.c))
eventListeners.add(MOUSE_EVENT)((e: MouseEventObject) => println("X: " + e.x))
eventListeners.add(KEY_EVENT)((e: KeyEventObject) => println(e.c + " again"))
우리 개별 이벤트 핸들러를 선택할 수 있음을 확인할 수 있습니다.
scala> eventListeners(KEY_EVENT).size
res3: Int = 2
그리고 우리는 그것을 위해 모든 핸들러를 이벤트를 발생하고 실행하는 척 할 수 있습니다
scala> eventListeners(KEY_EVENT).foreach(_(KeyEventObject('a')))
a
a again
을 그리고 아무것도 적절한 증거없이 기본 느슨하게 형식의지도로 얻을 수 없기 때문에이 모든 완벽하게 안전합니다. 예를 들어, String
에서 Unit
으로 함수를 추가하려고하면 컴파일 타임 오류가 발생합니다.
귀하의 코드가 더 이상 사용되지 않는다고 말해야합니다.이 대화는 https://groups.google.com/forum/#!msg/scala-ide-dev/PyejSImLLtE/EbqqSKPUMisJ에서 확인해야합니다. "케이스 - 투 - 케이스 상속은 금지되어 있습니다."... – idonnie
나는 그것을 알지 못했습니다. 저는 scala 2.9로 표준화되었지만 어쩌면 업그레이드 할 때가되었습니다. –
@DaveRafkind : 2.9에서도 대소 문자를 구분하지 않는 것이 좋습니다. 금지되지 않지만 컴파일러 경고가 나오는 곳입니다. –