Kotlin中能否同时为多种类型应用扩展函数?
能不能给多种类型同时写扩展函数?
嘿,你这个想法挺实用的!不过先直接说结论:你写的fun <Double || Float>.toString(): String这种语法在Kotlin里是不支持的,但咱们有几种替代方案能实现给Double、Float这类多个类型添加相同逻辑扩展函数的需求,下面给你唠唠:
方案一:拆分写多个扩展函数(最推荐)
这种方式简单直接,而且没有额外的运行时开销。如果多个类型的扩展逻辑完全一致,咱们可以把核心逻辑抽成一个私有工具函数,再分别给每个类型写扩展函数调用它就行:
// 抽离共用逻辑 private fun formatNumberToString(number: Number): String { // 这里写你想要的自定义逻辑,比如保留两位小数 return String.format("%.2f", number) } // 给Double写扩展 fun Double.toStringCustom(): String = formatNumberToString(this) // 给Float写扩展 fun Float.toStringCustom(): String = formatNumberToString(this)
这样不管是Double还是Float,都能调用toStringCustom()方法,而且代码复用性也拉满了。
方案二:用泛型+reified类型参数(适合类型较多的场景)
如果需要支持的类型特别多,不想一个个写扩展函数,可以用inline函数配合reified类型参数,在函数里做类型校验:
inline fun <reified T> T.toStringCustom(): String { // 先校验调用者是不是Double或Float,不是就抛异常 require(this is Double || this is Float) { "这个函数只支持Double和Float类型哦" } // 执行自定义逻辑 return when (this) { is Double -> String.format("%.2f", this) is Float -> String.format("%.2f", this) else -> throw IllegalArgumentException() // 其实前面的require已经保证不会走到这 } }
不过要注意,这种方式因为用到了reified,必须加inline关键字,而且会有运行时的类型检查,性能上比第一种略逊一筹,适合类型数量多的场景。
为啥你写的语法不行?
Kotlin里的泛型约束是用where子句来指定的,但where是要求类型同时满足所有约束条件(比如where T : A, T : B表示T必须既是A的子类又是B的子类),而不是满足任意一个,所以<Double || Float>这种“或”逻辑的语法是不存在的哦。
内容的提问来源于stack exchange,提问作者yaugenka
相关产品推荐
相关产品推荐

