scala - 这是如何类型不匹配?

标签 scala types

  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 => UnitEvent => Unit 的 _super_type .

因此,问题。如果将类型参数更改为 A >: Event ,它应该工作。

关于scala - 这是如何类型不匹配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5599602/

相关文章:

java - 无法从命令行运行 Scala-Neo4j 项目

javascript - TypeScript 是否可以从动态对象推断键?

c - 将不同类型的指针传递给函数 (C)

scala - 在 Scala 项目中使用 sbt 程序集时在 jar 中包含 Hyperic Sigar 库

Java数据类型问题

c# - 在 C# 中转换为未知类型反射

go - 如何查找类型是否为 float64

sql-server - 当 set_identity 关闭时,如何将 Spark 数据帧推送到 Sql Server 表?

scala - Atlassian Bamboo 5.x 是否与 Play Framework 2.x 兼容

scala - Apache Spark 3 和向后兼容性?