Kotlin课堂扩展

时间:2019-02-21 02:27:49

标签: kotlin kotlin-extension

我正在学习Kotlin,这是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类扩展中获取所需功能的同时,如何解决此编译错误?

2 个答案:

答案 0 :(得分:2)

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

该行中发生错误

return this % n == 0

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

答案 1 :(得分:0)

哦!

想一想,由于浮点精度问题,isMultipleOf在浮点数和双精度点上效果不佳。

这是修改后的代码:

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

然后编译。