2016-09-26 208 views
0

我想抓住从类的类型,我含蓄地推断:斯卡拉:通用隐类

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]]

是否有可能在这里得到类型或什么应该设计一个好方法?

EDIT

e.g:

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

编辑2

新增ToGet定义

+0

ToGet的定义在哪里? –

+0

@AlvaroCarrasco我已更新线程 –

+0

给'Builder'提供的'T'和''future'方法的类型参数'T'之间似乎没有关系。 “未来”推断“没有”,因为这是最好的,因为它是给出的。更多的代码可能会产生更好的答案。 –

回答

1

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

现在在ToGet上的future调用pimped没有可以使用的类型信息,因此它推断出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 
    ??? 
    } 
} 

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

+0

太棒了,我很难找出如何携带它......现在很清楚 –