trait Encoder[From, To] {
def encode(x: From): To
}
object Encoder {
implicit val thingToString: Encoder[Thing, String] = new Encoder[Thing, String] {
def encode(x: Thing): String = x.toString
}
}
trait Config {
type Repr
}
class MyConfig extends Config { type Repr = String }
//class ConcreteConfig { type Repr = String }
class Api[T](val config: Config) {
def doSomething(value: T)(implicit encoder: Encoder[T, config.Repr]): Unit = {}
}
case class Thing(a: Int)
object Test extends App {
import Encoder._
val api = new Api[Thing](new MyConfig)
api.doSomething(Thing(42))
}
到api.doSomething
調用失敗編譯:斯卡拉:類型類實例的隱式的查找路徑依賴型
could not find implicit value for parameter encoder: Encoder[Thing,Test.api.config.Repr]
如果我改變class Api[T]
的構造方法的簽名,這樣只有一個ConcreteConfig
,那麼編譯器可以知道config.Repr == String
和隱式查找成功。但是這對我的用例並不適用。
是否有任何其他方式來指導隱式查找?我是否因爲缺少類型優化或某種東西而丟失了類型信息?
'api.config.Repr' _is_一個穩定的路徑,雖然你的第二句話是正確的。 –