Kotlin 中的 Number 类解释
Number
在 Kotlin 中,有一个名为 Number 的基类,其在 Kotlin 中的描述为:
“所有平台类表示数值的超类。
这里你可以看到哪些类继承自 Number,并且可以作为它使用。
Kotlin Number 继承体系
由于你不能在 Number 上执行任何计算:
fun add(a: Number, b: Number) = a + b // 无法解析 '+' 的引用
很遗憾,你不能使用 Number 编写非常通用的算法,除非你使用 toInt、toLong 等运算符。这在某种程度上违背了使用它的目的:
// 理论上你可以这样做:
fun add(a: Number, b: Number) = a.toDouble() + b.toDouble()
// 但在那种情况下这样更好:
fun add(a: Double, b: Double) = a + b
最好公开声明类型并在外部而不是内部进行转换。很难找到实际的用途,你会想要接受所有可能的 Number 并将它们转换为其他类型。
表示
然而,如果你正在创建一个像 Money 这样的数值类,你可以继承 Number 类并实现所有 toInt、toLong 运算符,以便它可以轻松转换为其他类型:
class Money : Number() {
override fun toInt(): Int {...}
override fun toDouble(): Double {...}
...
}
然而,你可以不继承自 Number 做到这一点……很遗憾,它主要的功能是表示你正在处理某种形式的数字。还有更多吗?
其他用途
你可以为 Number 类编写你自己的 + 函数,看起来像这样:
inline operator fun <reified T : Number> T.plus(other: T) = when (T::class) {
Byte::class -> toByte() + other.toByte()
Short::class -> toShort() + other.toShort()
Int::class -> toInt() + other.toInt()
Long::class -> toLong() + other.toLong()
Float::class -> toFloat() + other.toFloat()
Double::class -> toDouble() + other.toDouble()
else -> throw IllegalArgumentException("Only numbers of the same type can be added")
} as T
现在,我们的加法示例将工作:
fun add(a: Number, b: Number) = a + b // 对编译器来说一切正常
但这是非常危险的,可能会引入多个难以调试的运行时错误。除非你正在一个单独的模块中工作,专门用于进行一些数值计算,否则请避免这样做!
感谢阅读,如果你喜欢,请继续关注我获取更多内容!