在Kotlin中共享Float和Double之间的扩展函数的实现

时间:2017-10-18 05:24:23

标签: templates kotlin extension-methods

注意:这个问题不是关于泛型类,而是关于泛型函数。(我不认为它是this one的副本:它更具体。 )

在我们的项目中,我们有一些实用函数来扩展DoubleFloat,例如toFixed(受Javascript's Number.toFixed启发)

fun Double.toFixed(digits: Int):String = java.lang.String.format("%.${digits}f", this)
fun Float.toFixed(digits: Int):String = java.lang.String.format("%.${digits}f", this)

如您所见,Double.toFixedFloat.toFixed具有相同的实现。

由于还有其他一些更复杂的扩展功能,因此一个版本(例如Double.toPrecision)中的改进和错误修复必须手动保持同步(使用Float.toPrecision),这是无聊且容易出错。

我尝试将重复的实现移动到共享的<templated>函数中,但是(正确地)它在未绑定函数的上下文中无法访问this

为了说明,我希望这样的事情:

private fun <T>toFixed(digits: Int):String = java.lang.String.format("%.${digits}f", this)
fun Double.toFixed = ::toFixed<Double>
fun Float.toFixed = ::toFixed<Float>

如果任何语言可以撼动这一点,那么Kotlin肯定可以!想法?

1 个答案:

答案 0 :(得分:4)

使用can only concatenate list (not "int") to list可以实现泛型类型的扩展。这样做,fun <T> T.toFixed(...)可以访问。

问题是,扩展可以用于任何类型!您可以使用this上限来限制它:

T

如果您真的必须将扩展名限制为 fun <T: Number> T.toFixed(...) Double ,则必须仅扩展具体类型。另外,请查看Koltin Float库,可能会有所帮助:)(适用于1.2-Beta):
https://github.com/JetBrains/kotlin/blob/master/js/js.libraries/src/core/math.kt