请考虑以下事项:
trait Foo {
type F[_]
type A
type FA = F[A]
def get: FA
}
class SeqStringFoo extends Foo {
type F[_] = Seq[_]
type A = String
def get: Seq[String] = Seq("hello world")
}
def exec[F <: Foo](foo: F): F#FA = foo.get
val seq1: Seq[Any] = exec(new SeqStringFoo()) // Seq[Any] = List(hello world)
val seq2: Seq[String] = exec(new SeqStringFoo()) // Error: Expression SeqIntFoo#FA doesn't conform to Seq[String]
seq2
无法编译,因为出于某种原因,使用类型投影 String
时,包装类型F#FA
的类型信息会丢失。
当返回的类型不是更高级的类型时,不会发生这种情况。
为什么会这样?
我该如何解决这个问题?
答案 0 :(得分:6)
看起来你只是忘记了专业化中F [_]的传递类型变量,请尝试:
class SeqStringFoo extends Foo {
type F[x] = Seq[x]
type A = String
def get: FA = Seq("hello world")
}
在其他情况下,您始终会针对任何Seq[_]
(Seq[Any]
,F[_]
)
F[Int]
(== F[String]
)