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