generics - 在Scala中可转换为结构类型的通用方法

标签 generics scala

为什么我不能这样做:

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, 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 类型类提供证据。为标准值。

关于generics - 在Scala中可转换为结构类型的通用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8422690/

相关文章:

scala - 使用 Apache Spark 和 mllib 生成关键字

Scala 鸭子打字模式匹配

重载方法的 Java 泛型问题

c# - 使用对象而不是泛型

c# - 使用普通参数和泛型参数重载构造函数

c# - 如何将 `where T : U` 泛型类型参数约束从 C# 转换为 F#?

scala - 将多个 Future[Seq] 连接成一个 Future[Seq]

java - Java 自界泛型的 Scala seq

Scala - 在父类中引用子类(泛型)

generics - typescript 泛型类型和未定义