给出以下代码:
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)
对于它看起来多么愚蠢,交换=:=操作数的顺序解决了这个问题
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#T到Seq[X].但是,它没有从提供等效转换Seq[X]到S#T,这是愚蠢的一部分:是不是平等应该是交换?
关于这个主题的一些额外细节:http://typelevel.org/blog/2014/07/02/type_equality_to_leibniz.html
| 归档时间: |
|
| 查看次数: |
97 次 |
| 最近记录: |