共享 Kotlin 中 Float 和 Double 之间扩展函数的实现
Sharing implementations of extension functions between Float and Double in Kotlin
注意:这个问题不是关于泛型 类,而是关于泛型函数。(我不认为它是 :比那个更具体。)
在我们的项目中,我们有一些实用函数可以扩展 Double
和 Float
,例如 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.toFixed
和 Float.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 肯定可以!想法?
可以使用 fun <T> T.toFixed(...)
实现泛型的扩展。这样做,this
就可以访问了。
问题是,扩展可以用于任何类型!您可以在 T
上使用上限来限制它:
fun <T: Number> T.toFixed(...)
如果你真的必须将扩展限制为only Float
and Double 只需要扩展具体类型。另外看看 Koltin math
库,可能会有帮助 :)(可用于 1.2-Beta):
https://github.com/JetBrains/kotlin/blob/master/js/js.libraries/src/core/math.kt
注意:这个问题不是关于泛型 类,而是关于泛型函数。(我不认为它是
在我们的项目中,我们有一些实用函数可以扩展 Double
和 Float
,例如 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.toFixed
和 Float.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 肯定可以!想法?
可以使用 fun <T> T.toFixed(...)
实现泛型的扩展。这样做,this
就可以访问了。
问题是,扩展可以用于任何类型!您可以在 T
上使用上限来限制它:
fun <T: Number> T.toFixed(...)
如果你真的必须将扩展限制为only Float
and Double 只需要扩展具体类型。另外看看 Koltin math
库,可能会有帮助 :)(可用于 1.2-Beta):
https://github.com/JetBrains/kotlin/blob/master/js/js.libraries/src/core/math.kt