как использовать перегрузку оператора в Kotlin для деления числа на числовой вектор

Я пытаюсь воссоздать в Kotlin то, что верю возможно в Pandas/Python. Я хотел бы выполнить деление так, чтобы число (Int, Double и т.д.) было разделено числовым вектором. (Мне сказали, что это возможно, но я не нашел ссылки.) Один пример, который я видел, был частью расчета скорости роста.

1.0 / data1['nYears']

Здесь 1,0 делится на каждое значение в data1['nYears'], и возвращается столбец, содержащий поэлементный результат. Например, если столбец содержит 2 и 4, результатом будет новый столбец, содержащий 0,5 и 0,25.

Можно ли это сделать в Котлине?

(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
}

Это прекрасно работает для целых чисел, но когда я попытался расширить его на другие числовые типы, я столкнулся с проблемой. Например, добавляя аналогичный метод для двойников, я получил ошибку, я полагаю, что это вызвано стиранием типа.

Platform declaration clash: The following declarations have the same JVM signature...

Затем я попытался предоставить один метод с аргументом (Vector ), чтобы покрыть оба случая, но получил

None of the following functions can be called with the arguments supplied

Есть ли способ сделать это в Котлине?


person L. Blanc    schedule 14.08.2019    source источник


Ответы (1)


Проблема в том, что имена функций/операторов одинаковы и будут генерировать одно и то же имя статической функции Java. Вы можете легко назначить новое имя Java с аннотацией @JvmName (см. 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 { ... }
person Rene    schedule 14.08.2019