1

以下函数可以编译,但只能与 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 一起使用,所以我尝试将它变成一个通用函数:

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 会导致警告“未经检查的转换:双倍转换为 T”。

如何正确地为 Float 和 Double 编写通用函数?

4

1 回答 1

0

Kotlin 不支持像 Java 这样的数字类型转换,也没有明确的方法可以将数字转换为擦除数字类型。为 Double 和 Float 重载方法要好得多。

但是,您可以取消此警告,因为实际上此代码将首先将返回值转换为 Number,然后它会<number type>Value从中调用,但这不是很好,因为此函数不是为整数值设计的,如果您调用triang(1),它会导致结果的精度损失。

于 2020-03-21T11:29:46.603 回答