如何使用抽象类型的类型约束

Yan*_*san 6 types scala

给出以下代码:

trait S { type T }
case class A(t: Seq[String]) extends S { type T = Seq[String] }
Run Code Online (Sandbox Code Playgroud)

我不明白这个编译错误:似乎没有使用证据.

def f[S<:A, X](g: => Seq[X])(implicit ev: S#T =:= Seq[X]) = new A(g)

<console>:50: error: type mismatch;
 found   : Seq[X]
 required: Seq[String]
       def f[S<:A, X](g: => Seq[X])(implicit ev: S#T =:= Seq[X]) = new A(g)
Run Code Online (Sandbox Code Playgroud)

Gab*_*lla 9

对于它看起来多么愚蠢,交换=:=操作数的顺序解决了这个问题

def f[S<:A, X](g: => Seq[X])(implicit ev: Seq[X] =:= S#T) = new A(g)
Run Code Online (Sandbox Code Playgroud)

谢谢你,scalac.

说明

当你说implicit ev S#T =:= Seq[X],编译器提供了一个隐式转换S#TSeq[X].但是,它没有从提供等效转换Seq[X]S#T,这是愚蠢的一部分:是不是平等应该是交换?

关于这个主题的一些额外细节:http://typelevel.org/blog/2014/07/02/type_equality_to_leibniz.html