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
не может скомпилировать:Scala: неявный поиск экземпляра класса типа для пути в зависимости от типа
could not find implicit value for parameter encoder: Encoder[Thing,Test.api.config.Repr]
Если изменить подпись конструктора class Api[T]
«s так, что она занимает ConcreteConfig
, то компилятор может сказать, что config.Repr == String
и неявный поиск завершается успешно. Но это не будет работать для моего случая использования.
Есть ли другой способ вести неявный поиск? Я теряю информацию о типе, потому что мне не хватает уточнения типа или чего-то еще?
'api.config.Repr'_is_ стабильный путь, хотя ваше второе предложение является правильным. –