Kotlin 类扩展

Posted

技术标签:

【中文标题】Kotlin 类扩展【英文标题】:Kotlin Class Extension 【发布时间】:2019-02-21 02:27:49 【问题描述】:

我只是将 Kotlin 作为 Project Euler 的一个有趣的副项目来学习。我刚刚在 5 分钟前开始使用 IntelliJ IDEA。

我有这个代码:

fun Number.isMultipleOf(n: Number): Boolean 
    return this % n == 0


fun main(args: Array<String>)
    println(10.isMultipleOf(5))

编译错误是这样的:

Kotlin: Unresolved reference.  None of the following candidates is applicable because of receiver type mismatch:
@Deprecated @InlineOnly public inline operator fun BigDecimal.mod(other: BigDecimal): BigDecimal defined in kotlin

我在 Java、Python、C++ 和 Swift 方面经验丰富,所以我认为 Kotlin 不应该是那么大的挑战。但是WTF是“接收器类型”?

如何在从 Number 类扩展中获得所需功能的同时修复此编译错误?

【问题讨论】:

【参考方案1】:

只是试图解释术语接收器类型和提到的错误。

行发生错误

return this % n == 0

如果您仔细观察,this 是变量类型 Number。所以 Number 是上面语句中的接收器类型(因为它接收要操作的第二个操作数)。 Number 是 Kotlin 中所有 Numeric 对象(如 Int、Float ...)的抽象超类,它没有执行取模(%)运算的内联函数。因此你得到了错误。希望这会有所帮助。

【讨论】:

【参考方案2】:

哦!

想一想,由于浮点精度问题,isMultipleOf 在浮点数和双精度数上不会那么有效。

所以这是修改后的代码:

fun Int.isMultipleOf(n: Int): Boolean 
    return this % n == 0

然后编译。

【讨论】:

以上是关于Kotlin 类扩展的主要内容,如果未能解决你的问题,请参考以下文章

通用扩展类 AND 在 Kotlin 中实现接口

Kotlin基础-扩展

在 Kotlin 中扩展数据类

Kotlin初识Kotlin之扩展函数与属性

Kotlin数据类的扩展函数

漫画:Kotlin 的扩展细节探究 | 鉴赏 Kotlin 的语言艺术!