玖叶教程网

前端编程开发入门

Kotlin 中的 Number 类

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

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

Kotlin 数字层次结构

你会发现很难在 Number 上执行任何计算,因为:

fun add(a: Number, b: Number) = a + b // '+' 运算符未解析的引用

遗憾的是,无法使用 Number 编写非常通用的算法,除非使用 toInttoLong 等操作符,但这有点违背了使用它的目的:

// 理论上你可以这样做:
fun add(a: Number, b: Number) = a.toDouble() + b.toDouble()
// 但在这种情况下,这样更好:
fun add(a: Double, b: Double) = a + b

最好在公开类型时声明类型,并在外部而不是内部进行转换。很难找到一个实际的用例,你会希望接受所有可能的 Number 并将其转换为其他类型。

表示

但是,如果创建一个像 Money 这样的数值类,可以继承 Number 类并实现所有的 toInttoLong 操作符,以便它可以轻松地转化为其他类型:

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

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

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言