Kotlin 中的 Number 类解释

Kotlin 中的 Number 类解释

Number

在 Kotlin 中,有一个名为 Number 的基类,其在 Kotlin 中的描述为:

所有平台类表示数值的超类。

这里你可以看到哪些类继承自 Number,并且可以作为它使用。

7d7be9824d27e511fadf0573b9a1c28e.png

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 // 对编译器来说一切正常

但这是非常危险的,可能会引入多个难以调试的运行时错误。除非你正在一个单独的模块中工作,专门用于进行一些数值计算,否则请避免这样做!

感谢阅读,如果你喜欢,请继续关注我获取更多内容!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值