kotlin - 如何在 Kotlin 中使用运算符重载将数字除以数字向量

标签 kotlin operator-overloading extension-methods type-parameter

我正在尝试在 Kotlin 中重新创建我认为在 Pandas/Python 中可能的东西。我想执行除法,以便将数字(Int、Double 等)除以数字向量。 (有人告诉我这是可能的,但还没有找到引用资料。)我见过的一个例子是增长率计算的一部分

1.0 / data1['nYears']

这里 1.0 除以 data1['nYears'] 中的每个值,然后返回一列,其中包含按元素计算的结果。例如,如果列包含 2 和 4,则结果将是包含 0.5 和 0.25 的新列。

这可以在 Kotlin 中完成吗?

(FWIW,反向计算(将一列除以标量常数)可能更重要,但我想我会从这里开始。)

我使用带有扩展函数的运算符重载找到了一个部分解决方案:
operator fun Int.div(vector: Vector<Int>) : Vector<Double> {
    val result = Vector("", ArrayList<Double?>())
    for (e in vector) {
        if (e == null) {
            result.add(null)
        } else {
            result.add(this / (e * 1.0))
        }
    }
    return result
}

这适用于 Ints,但是当我尝试将其扩展到其他数字类型时,我遇到了麻烦。例如,为 double 添加类似的方法我得到一个错误,我相信是由类型删除引起的。
Platform declaration clash: The following declarations have the same JVM signature...

接下来,我尝试提供一个带有 (Vector) 参数的方法来涵盖这两种情况,但是得到了
None of the following functions can be called with the arguments supplied

有没有办法在 Kotlin 中做到这一点?

最佳答案

问题是函数/运算符的名称相同,并且会生成相同的静态 Java 函数名称。您可以使用 @JvmName 轻松分配新的 Java 名称。注释(见 https://kotlinlang.org/docs/reference/java-to-kotlin-interop.html#handling-signature-clashes-with-jvmname)。

这是标准库中的一个示例:

@JvmName("sumOfInt")
fun Iterable<Int>.sum(): Int { ... }

@JvmName("sumOfFloat")
fun Iterable<Float>.sum(): Float { ... }

关于kotlin - 如何在 Kotlin 中使用运算符重载将数字除以数字向量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57487564/

相关文章:

spring-boot - Spring REST 端点内的 Kotlin 协程

c++ - 如何对类的 const 实例使用打印运算符?

c# - 类属性——属性为空时通过扩展方法填充

.net - 添加扩展方法我觉得应该在框架: bad idea?

c# - 扩展方法和编译时检查

kotlin - 将枚举成员转换为相应的文本

java - 如何在屏幕上的特定位置设置 View ?

kotlin - 使用 super 的 kotlin 中的扩展函数

C++ - 链表堆栈运算符重载函数

c++ - 如何重载运算符以在 operator[] 调用中调用 setter 函数?