我编写操作符
private fun method() {
operator fun Float.rangeTo(other: Int) {
(this.toInt()..other).forEach { print(it) }
}
0f..4
}
此操作效果良好,即打印01234
但当我用Int
替换float
时,它不再工作,即不打印01234
private fun method() {
operator fun Int.rangeTo(other: Int) {
(this..other).forEach { print(it) }
}
0..4
}
我错过了什么?我该怎么做?
如果您在IntelliJ中查看此代码,您将在rangeTo
函数上得到警告形式的答案:
扩展被一个成员遮蔽:public最终运算符fun rangeTo(other:Int(:IntRange
扩展不能覆盖类型已经具有的方法,并且由于Int
具有非扩展rangeTo(Int)
方法,0..4
语法将始终调用该方法。如果你仔细想想,当你写下this..other
时,你实际上是在利用这个事实,因为这是对内置rangeTo
运算符的调用,而不是对你自己的扩展函数的递归调用。
它使用Float
的原因是它没有自己的成员rangeTo(Int)
方法。
rangeTo
已经是Int
的一个成员,正如您在Intellij IDEA中看到的那样,它隐藏了您创建的运算符。这是经过设计的。