注意:这个问题不是关于泛型类,而是关于泛型函数。(我不认为它是this one的副本:它更具体。 )
在我们的项目中,我们有一些实用函数来扩展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肯定可以!想法?
答案 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