如何在Scala中链接泛型含义?

时间:2016-01-11 21:07:09

标签: scala slick implicit-conversion slick-3.0 implicits

this post讨论了暗示的链接,但我认为它并不能涵盖我的案例,因为我有一般性的含义。演示该问题的示例项目位于here。要重现these,应注释掉两行。

所以我对具体类型有许多含义,例如

implicit val ObjectIdColumnType: ColumnType[ObjectId] = MappedColumnType.base[ObjectId, Array[Byte]](
      { obj => obj.toByteArray }, { arr => new ObjectId(arr) }
    )

我希望所有这些都能自动生成GetResult[T]隐式值。因此我写了以下函数

implicit def getResultForTypedTypes[T](implicit bct: ColumnType[T]): GetResult[T] =
  GetResult[T](r => bct.getValue(r.rs, r.currentPos))

我希望这个函数有原型,如

def << [T](implicit f: GetResult[T]): T = f(this)

可以选择GetResult[ObjectId]

可悲的是我收到了错误

Error:(78, 20) could not find implicit value for parameter f: slick.jdbc.GetResult[org.bson.types.ObjectId]
      val id = r.<<[ObjectId]
                   ^

我启用了log-implicits,发现看似无关的隐式隐藏得到了

Information:(78, 20) getResultForTypedTypes is not a valid implicit value for slick.jdbc.GetResult[org.bson.types.ObjectId] because:
hasMatchingSymbol reported error: ambiguous implicit values:
 both value strListTypeMapper in object MyAPI of type => co.greenhouse.rabbit.server.db.MyPostgresDriver.DriverJdbcType[List[String]]
 and value ObjectIdColumnType in object MyAPI of type => co.greenhouse.rabbit.server.db.MyPostgresDriver.BaseColumnType[org.bson.types.ObjectId]
 match expected type co.greenhouse.rabbit.server.db.MyPostgresDriver.api.BaseColumnType[T]
      val id = r.<<[ObjectId]
                   ^

我怎样才能在这个含义的意外中找到问题?

0 个答案:

没有答案