gpt4 book ai didi

generics - kotlin:通用到不同类型

转载 作者:行者123 更新时间:2023-12-02 13:39:25 25 4
gpt4 key购买 nike

我需要这样的线性函数:

class Linear(val a : Double, val b : Double) {
fun eval(in : Double) {
return a*in + b
}
}

然后,我对向量也需要同样的东西。
class Vector3d(val a1 : Double, val a2 : Double, val a3 : Double) {
// use operator overloading https://kotlinlang.org/docs/reference/operator-overloading.html to make +, -, /, *, etc. possible for vectors
}

class Linear(val a : Vector3d, val b : Vector3d) {
fun eval(in : Vector3d) {
return a*in + b
}
}

如您所见,两个线性类是相同的(参数类型除外)。现在,我不能将类设为通用,因为 Double 和 Vector3d 没有共同的父类(super class)。

如果我只想写一次Linear,我唯一的选择是我自己的Double-type,它与Vector3d有一个通用的接口(interface)。但是,这意味着我不能再在源代码中使用 0,但我必须在任何地方使用 MyDouble(0)。我可以重载 Linear 的构造函数以接受 Double,并在内部创建 MyDouble 对象,但是,我需要为我的 API 中的每个方法执行此操作。

有更好的解决方案吗?

最佳答案

您可以通过定义具有两个实现/子类的接口(interface)/类来引入间接级别:一个用于原始 double ,一个用于您的Vector3d。 .但是,您可能会发现开销是不可取的。例如。:

interface Arithmetical<A : Arithmetical<A>> {
operator fun plus(other: A): A
operator fun minus(other: A): A
operator fun times(other: A): A
operator fun div(other: A): A
}

class Linear<A : Arithmetical<A>>(val a: A, val b: A) {
fun eval(`in`: A): A {
return a * `in` + b
}
}

class ArithmeticalDouble(val value: Double) : Arithmetical<ArithmeticalDouble> {
override fun plus(other: ArithmeticalDouble) = ArithmeticalDouble(value + other.value)
override fun minus(other: ArithmeticalDouble) = ArithmeticalDouble(value - other.value)
override fun times(other: ArithmeticalDouble) = ArithmeticalDouble(value * other.value)
override fun div(other: ArithmeticalDouble) = ArithmeticalDouble(value / other.value)
}

class Vector3d(val a1: Double, val a2: Double, val a3: Double) : Arithmetical<Vector3d> {
override fun plus(other: Vector3d): Vector3d = TODO()
override fun minus(other: Vector3d): Vector3d = TODO()
override fun times(other: Vector3d): Vector3d = TODO()
override fun div(other: Vector3d): Vector3d = TODO()
}

这使得使用原始 double 值更容易被听到,因为现在您必须包装和解开它们,但它确实允许您使用泛型来定义 Linear .

关于generics - kotlin:通用到不同类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43168584/

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