Kotlin generi c функция для Float и Double - PullRequest
0 голосов
/ 21 марта 2020

Следующая функция компилируется, но может использоваться только с Doubles:

fun triang(x: Double): Double {
    var m = x - truncate(x)
    if (m < 0) m += 1.0
    return when {
        m < 0.25 -> 4.0 * m
        m < 0.50 -> 2.0 - 4.0 * m
        m < 0.75 -> 2.0 - 4.0 * m
        else -> 4.0 * m - 4.0
    }
}

Я хочу иметь возможность использовать эту функцию также с Floats, поэтому я попытался превратить ее в обобщенную функцию c :

fun <T: Number> triang(x: T): T {
    var m = x.toDouble() - truncate(x.toDouble())
    if (m < 0) m += 1.0
    return when {
        m < 0.25 -> 4.0 * m
        m < 0.50 -> 2.0 - 4.0 * m
        m < 0.75 -> 2.0 - 4.0 * m
        else -> 4.0 * m - 4.0
    } as T // problem here
}

Но это не работает, потому что приведение к T вызывает предупреждение «Непроверенное приведение: Double to T».

Как правильно написать обобщенную функцию c для Float и Double?

1 Ответ

0 голосов
/ 21 марта 2020

Kotlin не поддерживает приведение чисел, подобных Java, и не существует определенного способа преобразования числа в тип стертого числа. Намного лучше перегрузить метод для Double и Float.

Однако вы можете отключить это предупреждение, потому что на самом деле этот код будет сначала преобразовывать возвращаемое значение в Number, затем он будет вызывать <number type>Value из него, но это не очень хорошо, так как эта функция не предназначена для целочисленных значений, и если вы вызовете triang(1), это приведет к потере точности в результате.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...