val eventListeners = new HashMap[Class[Event], ArrayBuffer[Event => Unit]]
def addEventListener[A <: Event](f: A => Unit)(implicit mf: ClassManifest[A]): A => Unit = {
eventListeners.getOrElseUpdate(mf.erasure.asInstanceOf[Class[Event]], ArrayBuffer[Event => Unit]()) += f
f
}
正在抛出:
error: type mismatch;
found : (A) => Unit
required: (this.Event) => Unit
eventListeners.getOrElseUpdate(mf.erasure.asInstanceOf[Class[Event]], ArrayBuffer[Event => Unit]()) += f
为什么说找到了
(A) => Unit
? f
的值是一个函数,即 (Event) => Unit
.不是A
只是一个类型参数,而不是签名?示例调用:
addEventListener { e:FooEvent => .... }
最佳答案
类(class)Function1
在其参数上是逆变的。即它的类型是Function1[-T, +R]
.
这意味着 Any => Unit
的函数是 Event => Unit
的子类型, 但对于 A
Event
的亚型, A => Unit
是 Event => Unit
的 _super_type .
因此,问题。如果将类型参数更改为 A >: Event
,它应该工作。
关于scala - 这是如何类型不匹配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5599602/