Scala:两种方法,不同的参数类型但相同的代码:如何统一?

时间:2009-05-31 19:41:44

标签: scala

我有以下课程:

case class Vec2(x: Int, y: Int) { def +(other: Vec2) = Vec2(x + other.x, y + other.y) }
case class Vec3(x: Int, y: Int, z: Int) { def +(other: Vec3) = Vec3(x + other.x, y + other.y, z + other.z) }

以下方法:

def doStuff1(a: Vec2, b: Vec2) = (a, a + b)
def doStuff2(b: Vec3, b: Vec3) = (a, a + b)

我的问题:如何以类型安全的方式将这两个函数合并为一个通用函数?这些课程可能会以任何方式改变。

这样的东西
def doStuff[V](a: V, b: V) = (a, a + b)

显然不会起作用,因为调用了“+”方法。我已经尝试了各种疯狂的东西(带有抽象类型的公共基类,显式类型的自引用,差异,......)但是无法提出解决方案。

我能想到的最好的想法是运行时检查(模式匹配或isInstanceOf / asInstanceOf),但这不符合类型安全要求。我只是想/希望必须有更好的方法来做到这一点。

2 个答案:

答案 0 :(得分:20)

trait Vector[V <: Vector[V]] { this: V =>
  def +(other: V): V
}

case class Vec2(x: Int, y: Int) extends Vector[Vec2] {
  override def +(other: Vec2): Vec2 = Vec2(x + other.x, y + other.y)
}

case class Vec3(x: Int, y: Int, z: Int) extends Vector[Vec3] {
  override def +(other: Vec3): Vec3 = Vec3(x + other.x, y + other.y, z + other.z)
}

def doStuff[V <: Vector[V]](a: V, b: V): (V, V) = (a, a + b)

答案 1 :(得分:0)

您可以尝试某种Structural Type。像这样:

def doStuff[V <: {def +(other: V): V }](a: V, b: V) = (a, a + b)