Kotlin中的Number类

程序员咋不秃头 2024-08-15 22:28:54

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

Number 是所有表示数值的平台类的超类。以下是继承自 Number 并可作为其使用的类。

Kotlin 数字层次结构

你会发现很难在 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。除此之外,是否还有其他用途?

其他用法

可以为 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 // 编译器一切正常

但这种做法非常危险,可能引入多种难以调试的运行时错误。除非你在一个专门为执行数值计算而构建的模块中工作,否则请避免这样做!

0 阅读:7