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]
それはConcreteConfig
をとるように私はclass Api[T]
のコンストラクタのシグネチャを変更した場合コンパイラはconfig.Repr == String
と暗黙のルックアップが成功したことを伝えることができます。しかし、これは私のユースケースではうまくいかないでしょう。
暗黙の参照を導く他の方法はありますか?私は型の情報を失っているのですか?
'api.config.Repr' _は安定したパスですが、2番目の文は正しいですが。 –