泛型 – 在scala中可转换为结构类型的泛型方法
发布时间:2020-12-16 08:58:30 所属栏目:安全 来源:网络整理
导读:为什么我不能这样做: def compare[A % { def toInt: Int },B % { def toInt: Int }] (bs: Seq[A],is: Seq[B]): Boolean = { bs.toArray.zip(is) forall { p = p._1.toInt == p._2.toInt } } 为了比较任何可转换为Int的类型序列?我怎样才能实现类似的模式?
为什么我不能这样做:
def compare[A <% { def toInt: Int },B <% { def toInt: Int }] (bs: Seq[A],is: Seq[B]): Boolean = { bs.toArray.zip(is) forall { p => p._1.toInt == p._2.toInt } } 为了比较任何可转换为Int的类型序列?我怎样才能实现类似的模式? 更新:这应该运行Message.compare(List(1.0,2.0,3.0),List(0,0)) 解决方法
问题所在的一个很好的例子似乎是这样做:
val a = implicitly[Int => { def toInt : Int }] a(1).toInt Scala 2.9.1在运行时代码中的某个时刻爆炸 – 我只能认为这是一个错误. 但是,您可以使用类型类来实现您正在寻找的效果:以下代码适用于您的所有示例: def compare[A : Numeric,B : Numeric](bs : Seq[A],cs : Seq[B]) = { (bs,cs).zipped.forall(implicitly[Numeric[A]].toInt(_) == implicitly[Numeric[B]].toInt(_)) } 这也应该比使用结构类型的版本更快.如果您需要添加自己的类型,并且可以转换为整数,则可以使用与标准值在https://lampsvn.epfl.ch/trac/scala/browser/scala/tags/R_2_9_1_final/src//library/scala/math/Numeric.scala#L1处完成相同的方式为Numeric类型类提供证据. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |