gpt4 book ai didi

scala - 消除唯一不同的是类型的重复代码

转载 作者:行者123 更新时间:2023-12-01 11:21:56 25 4
gpt4 key购买 nike

我有两个结构等价的类对,它们唯一的区别是类型。我希望能够将 V1V2 以及 K1K2 合并。我控制这四个类,但我无法修改 takesDoublesOrLists - 它来自库。

class V1 (
val a: Double,
val b: Double,
// ...
val z: Double
)

class K1(v: V1) {
def doIt = takesDoublesOrLists(v.a, v.b, /* ..., */ v.z)
}

class V2 (
val a: List[Double],
val b: List[Double],
// ...
val z: List[Double]
)

class K2(v: V2) {
def doIt = takesDoublesOrLists(v.a, v.b, /* ..., */ v.z)
}

我尝试关注 type class pattern , 但出现重载方法 takesDoublesOrLists 无法应用于我的类型参数的错误。

编辑:

重载函数takesDoublesOrLists的签名,顾名思义:

def takesDoublesOrLists(a: Double, b: Double, /* ..., */ z: Double): Something = /* ... */
def takesDoublesOrLists(a: List[Double], b: List[Double], /* ..., */ z: List[Double]): Something = /* ... */

最佳答案

我知道如何合并 V1V2,但不能合并 K1K2:

class V[T] (
val a: T,
val b: T
// ...
val z: T
)

class K1(v: V[Double]) {
def doIt = takesDoublesOrLists(v.a, v.b, /* ..., */ v.z)
}

class K2(v: V[List[Double]]) {
def doIt = takesDoublesOrLists(v.a, v.b, /* ..., */ v.z)
}

编辑:如果您的 K1 和 K2 类(class)比您举例说明的更复杂,您可以使用特征打破这种行为:

trait KDoubles {
def v: V[Double]
def doIt = takesDoublesOrLists(v.a, v.b, /* ..., */ v.z)
}

trait KLists {
def v: V[List[Double]]
def doIt = takesDoublesOrLists(v.a, v.b, /* ..., */ v.z)
}

class K {
// common stuff ...
}

class K1 extends K with KDoubles {
// ...
}

class K2 extends K with KLists {
// ...
}

关于scala - 消除唯一不同的是类型的重复代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44144317/

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