2017-04-15 48 views
4

比方說,我們有一個特點:類型參數的案例類使用特質W/Implicits

trait ThingToThing[-A, +B] { def apply(a: A): B } 

及其配套對象:

object ThingToThing { 
    implicit object StringToBoolean extends ThingToThing[String, Boolean] { 
    override def apply(a: String): Boolean = a.toBoolean 
    } 
} 

和案例類:

case class Thing[A](a: A) { 
    def to[B](implicit thing: ThingToThing[A, B]): B = thing(a) 
} 

這使我可以做到以下幾點:

Thing("true").to[Boolean] 
res0: Boolean = true 

這是所有罰款和花花公子,我可以這樣做:

case class MyClass(ss: Seq[String]) { 
    def doStuff(s: String) = Thing(s).to[Boolean] 
} 

但想什麼,我做的,但是,是這樣的:

case class MyClass[B](ss: Seq[String]) { 
    def doStuff(s: String) = Thing(s).to[B] 
} 

但是,這錯誤:

error: could not find implicit value for parameter thing: ThingToThing[String,B] 

有沒有一種方法可以在我的MyClass中使用類型參數?

**不要被抓住玩具的例子,將字符串轉換爲布爾值;我只是用它作爲一個簡單的例子來說明問題。

回答

5

在調用點Thing(s).to[B]編譯器找不到的ThingToThing[String,B]隱式實例(B未知):

case class MyClass[B](ss: Seq[String]) { 
    def doStuff(s: String) = Thing(s).to[B] 
} 

因此錯誤。

你可以聲明所需的隱含在構造函數中有它在創建對象的調用點(當B是已知的)解決:

case class MyClass[B](ss: Seq[String])(implicit t2t: ThingToThing[String, B]) { 
    def doStuff(s: String) = Thing(s).to[B] 
} 

,或者在方法聲明它有它的解決方法調用的調用位置(當B已知時):

case class MyClass[B](ss: Seq[String]) { 
    def doStuff(s: String)(implicit t2t: ThingToThing[String, B]) = Thing(s).to[B] 
} 
+0

太棒了!非常感謝! – user451151