Kotlin类扩展

问题描述 投票:0回答:2

我只是在学习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类扩展中获取所需的功能时修复此编译错误?

kotlin kotlin-extension
2个回答
2
投票

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

行中出错

return this % n == 0

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


0
投票

哦!

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

所以这是修改后的代码:

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

那就编译了。

© www.soinside.com 2019 - 2024. All rights reserved.