Scala:Generic Implicit类

时间:2016-09-26 18:52:26

标签: scala generics implicit-conversion

我试图从类I中隐藏推断类型:

case class ToGet(key: String)

class Builder[T <: AnyRef] {

  def get(key: String)(implicit mf: Manifest[T]): ToGet = {
    ToGet(key)
  }
}

object Builder {

  import scala.reflect.runtime.universe._

  implicit class ToGetImplicits(obj: ToGet) {
    def future[T <: AnyRef]()(implicit mf: Manifest[T]): Future[Option[T]] = ???
  }
}

当我创建一个实例并调用上面的未来时,它会返回Future[Option[Nothing]]

是否可以在此处获取类型或者设计该类型的好方法?

修改

e.g:

val obj = new Builder[String]
obj.get("myKey").future() //this returns a Future[Option[Nothing]]

编辑2

添加了ToGet定义

1 个答案:

答案 0 :(得分:1)

obj.get("myKey")返回ToGet。此时,清单被提供并被忽略。我们现在拥有的只是ToGet

现在,future上的ToGet来电是没有可以使用的类型信息,因此它会推断Nothing

根据代码的意图,您可能希望将清单作为隐式参数传递给ToGet类:

case class ToGet [T] (key: String)(implicit val mf: Manifest[T])

现在你的隐含类:

implicit class ToGetImplicits[T](obj: ToGet[T]) {
  def future(): Future[Option[T]] = {
    // you can access obj.mf here for the manifest
    ???
  }
}

事情是:某事必须携带类型信息。