Ниже не компилируется из последней строки:Косвенно завернутые черты с элементом типа не компилирует
object ImplicitWrappedTraitWithType {
trait Wrapper[+T] {
def unwrap: T
}
object Wrapper {
def apply[T](implicit w: Wrapper[T]): Wrapper[T] = w
}
trait IO[In] {
type Out
def out: Out
}
implicit def decoder[In]: Wrapper[IO[In] {type Out = String}] = new Wrapper[IO[In] {type Out = String}] {
override def unwrap: IO[In] {type Out = String} = new IO[In] {
override type Out = String
override val out: Out = "yeah"
}
}
val wrap = Wrapper[IO[String]]
val io: IO[String] = wrap.unwrap
val out: String = io.out //actual type: unwrap.Out
}
Что я могу сделать, чтобы убедить компилятор, что val out
является String
?
Предварительное редактирование - игнорировать этот
Пример 1 - это не компилируется:
object ImplicitWrappedTraitWithType {
class Wrapper[T]
object Wrapper {
def apply[T](implicit w: Wrapper[T]): Wrapper[T] = w
}
trait IO[In] {
type Out
}
implicit def decoder[In]: Wrapper[IO[In] {type Out = String}] = null
//client code
Wrapper[IO[String]]
}
Пример 2 - тогда как это делает:
object ImplicitWrappedTraitWithType {
class Wrapper[T]
object Wrapper {
def apply[T](implicit w: Wrapper[T]): Wrapper[T] = w
}
trait IO[In] {
type Out
}
implicit def decoder[In]: Wrapper[IO[In]] = null
//client code
Wrapper[IO[String]]
}
В коде клиента я не знаю, какой будет тип Out
, но мне нужно иметь к нему доступ, когда я извлекаю экземпляр IO
из Wrapper
(код для этого не показан).
Как изменить «Пример 1» для компиляции, сохраняя параметр «Выход» таким образом, который отображается для кода клиента.
(Прокомментируйте, если эта формулировка не ясна)
* В коде клиента я не знаю, какой будет тип Out, но мне нужно иметь к нему доступ, когда я извлекаю экземпляр IO из Wrapper * Но он будет виден вам через 'IO [Т] .Out'. Я не уверен, что понимаю проблему. –
@ YuvalItzchakov во втором примере 'Out' не имеет ограничений. –
@ Jasper-M Я вижу, что он безусловный, но я не уверен, что OP хочет, чтобы это было так, как он говорит о «видимости». Я пытаюсь понять, что он имеет в виду. –