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

时间:2014-10-10 09:22:00

标签: scala types

给出以下代码:

trait S { type T }
case class A(t: Seq[String]) extends S { type T = Seq[String] }

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

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)

1 个答案:

答案 0 :(得分:9)

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

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

谢谢你,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