gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 18:17:07 24 4
gpt4 key购买 nike

我有以下类(class):

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),但这不满足类型安全要求。我只是认为/希望必须有更好的方法来做到这一点。

最佳答案

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)

关于Scala:两种方法,不同的参数类型但相同的代码:如何统一?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/932701/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com