覆盖运算符Int RangeTo不起作用

时间:2018-07-11 13:38:41

标签: kotlin

我写运算符

private fun method() {
    operator fun Float.rangeTo(other: Int) {
        (this.toInt()..other).forEach { print(it) }
    }
    0f..4
}

这很好用,即打印01234

但是当我将float替换为Int时,它不再起作用,即不打印01234

private fun method() {
    operator fun Int.rangeTo(other: Int) {
        (this..other).forEach { print(it) }
    }
    0..4
}

我想念什么?我该如何运作?

2 个答案:

答案 0 :(得分:5)

如果您在IntelliJ中查看此代码,则会在rangeTo函数上以警告的形式得到答案:

  

扩展被成员遮盖:public final运算符fun rangeTo(other:Int):IntRange

扩展不能覆盖类型已经具有的方法,并且由于Int具有非扩展rangeTo(Int)方法,因此0..4语法将始终调用该方法。如果您考虑一下,实际上在记下this..other时就利用了这一事实,因为这是对内置rangeTo的调用,而不是对您自己的扩展的递归调用功能。

它与Float一起工作的原因是它没有自己的成员rangeTo(Int)方法。

答案 1 :(得分:1)

rangeTo已经是Int的成员,并且正如您在Intellij IDEA中看到的那样,该阴影已隐藏。这是设计使然。