scala – 如何使用抽象类型的类型约束
发布时间:2020-12-16 18:53:20 所属栏目:安全 来源:网络整理
导读:给出以下代码: 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; fo
给出以下代码:
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) 解决方法
对于它看起来多么愚蠢,交换=:=操作数的顺序解决了这个问题
def f[S<:A,X](g: => Seq[X])(implicit ev: Seq[X] =:= S#T) = new A(g) 谢谢你,scalac. 说明 当你说隐式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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容