如何将子类的功能传递给scala映射?

时间:2018-01-23 20:38:05

标签: scala

我正在尝试将带有子类参数的函数传递到地图中(没有成功):

  trait GeneralRequestData
  case class MyRequestData(some: String) extends GeneralRequestData

  val myRequestDataToJsValue = (m: MyRequestData) => Json.obj("a" -> "b")

  val transformers: scala.collection.mutable.Map[String, _ <: GeneralRequestData => JsValue] = new mutable.HashMap()
  transformers.put("myRequestData", myRequestDataToJsValue) // Error:(76, 37) type mismatch; found : myRequestDataToJsValue.type (with underlying type MyRequestData => play.api.libs.json.JsObject) required: _$2 transformers.put("myRequestData", myRequestDataToJsValue)

但我收到错误:

  

错误:(76,37)类型不匹配;发现:myRequestDataToJsValue.type   (基础类型为MyRequestData =&gt; play.api.libs.json.JsObject)   必需:_ $ 2 transformers.put(“myRequestData”,   myRequestDataToJsValue)

如何修复它并使用子类参数传递该函数?

1 个答案:

答案 0 :(得分:2)

transformers的类型定义中缺少一些parens,它应该是:

val transformers: mutable.Map[String, (_ <: GeneralRequestData) => JsValue] =
    new mutable.HashMap()

这告诉编译器只有函数的参数是GeneralRequestData的子类。如果没有parens,编译器希望map值是GeneralRequestData => JsValue的子类,但值myRequestDataToJsValue不是此类型的实例,因为它不接受任意GeneralRequestData