加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读