我正在尝试将带有子类参数的函数传递到地图中(没有成功):
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)
如何修复它并使用子类参数传递该函数?
答案 0 :(得分:2)
transformers
的类型定义中缺少一些parens,它应该是:
val transformers: mutable.Map[String, (_ <: GeneralRequestData) => JsValue] =
new mutable.HashMap()
这告诉编译器只有函数的参数是GeneralRequestData的子类。如果没有parens,编译器希望map值是GeneralRequestData => JsValue
的子类,但值myRequestDataToJsValue
不是此类型的实例,因为它不接受任意GeneralRequestData
。