Scala型投影具有更高的类型

时间:2015-11-25 13:27:38

标签: scala higher-kinded-types type-projection

请考虑以下事项:

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的类型信息会丢失。

当返回的类型不是更高级的类型时,不会发生这种情况。

为什么会这样?

我该如何解决这个问题?

1 个答案:

答案 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]