に以下をコンパイルしていないので、最後の行でコンパイルされません:暗黙的に包まれた形質は
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
(コードは表示されていません)から抽出すると、そのインスタンスにアクセスできるようにする必要があります。
Outパラメータをクライアントコードで見えるように保持しながら、これをコンパイルするにはどのように変更する必要がありますか。
は
* Outのタイプがわからないのですが、WrapperからIOのインスタンスを抽出するときにアクセスできる必要があります。*しかし、IO [T]。アウト。私は問題を理解しているかどうか分からない。 –
@YuvalItzchakovは、2番目の例の「Out」は制約されていません。 –
@ Jasper-M拘束されていないことがわかりましたが、OPが「可視性」について話しているようにしたいとは思っていません。私は彼が何を意味するのか理解しようとしています。 –