给出以下代码:
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)
答案 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#T
到Seq[X]
的隐式转换。然而,它并没有提供从Seq[X]
到S#T
的等效转换,而且这是一个愚蠢的部分:不应该是可交换的等式吗?
此处有关此主题的一些额外详情:http://typelevel.org/blog/2014/07/02/type_equality_to_leibniz.html