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

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

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

Kotlin的`let`是一个作用域函数,用于在特定的上下文执行代码块。它的主要用途是进行非空判断和链式调用。 使用`let`函数,您可以在可空对象上执行操作,同时避免了显式地进行null检查。它接收一个 lambda 表达式作为参数,并将调用对象作为 lambda 表达式的参数。 下面是一个示例: ```kotlin val name: String? = "John" name?.let { println("Name is not null: $it") // 在这里可以安全地操作非空的 name 对象 // 例如:访问它的属性或调用它的方法 } ``` 在上面的代码,我们首先对可空对象`name`进行了非空判断。如果`name`不为null,`let`函数会执行 lambda 表达式的代码,其`it`表示非空的`name`对象。在 lambda 表达式,我们可以安全地访问和操作该对象。 `let`函数还可以用于链式调用。例如: ```kotlin val numbers: List<Int>? = listOf(1, 2, 3, 4, 5) numbers?.let { it.filter { number -> number % 2 == 0 } }.let { it?.forEach { evenNumber -> println("Even number: $evenNumber") } } ``` 在上面的示例,我们首先对可空列表`numbers`进行了非空判断。然后,我们使用`let`函数在 lambda 表达式对列表进行过滤操作,并将结果赋给变量`it`。接下来,我们再次使用`let`函数在 lambda 表达式对过滤后的列表进行遍历操作。 总之,`let`函数是一种简洁而安全的方式来在特定上下文执行代码块,并处理可空对象的情况。它在 Kotlin 非常常用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值