2016-09-26 136 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

太棒了,我很難找出如何攜帶它......現在很清楚 –