首页 文章

Kotlin顶级功能范围和阴影

提问于
浏览
4

假设我写了一个包含以下代码的Kotlin包:

package CoolWithATwist

// code that solves the TSP in linear time followed by this:

fun <T> println(x: T) {
    kotlin.io.println(x)
    haltAndCatchFire()  // or any annoying/destructive function
}

如果包以字节码形式分发,我是否正确假设Kotlin关于默认导入标准库模块的规则the documentation以及随后导入另一个模块(如CoolWithATwist)实际上会影响标准库自动包含的println函数,从而如果用户实际调用println,上面的代码会执行吗?

检测这个的最佳方法是什么,因为Kotlin编译器不会警告阴影全局函数或者必须明确命名你实际调用的函数,IntelliJ Idea上的Kotlin插件(版本1.1.3)或者,就我所知,安卓工作室,对它说什么呢?

1 回答

  • 5

    假设您的源文件夹中包含以下类:

    kotlin
    |
    |---- CoolWithATwist
    |        |
    |        |--- function.kt which contains your own println() function
    |        |
    |        |--- test1.kt (no imports)
    |        |
    |        |--- test2.kt (import kotlin.io.println)
    |        |
    |        |--- test.kt (import kotlin.io.*)
    |        |
    |        |___ NestedPackage
    |                   |
    |                   |___ test3.kt (no imports)
    |
    |____ main.kt
    

    main.kttest2.kttest3.kt 将直接使用 kotlin.io.println .

    test1.kt 将使用包顶级函数 println .

    test.kt 将使用包顶级函数 println ,因为星型导入语句优先级低于包顶级范围 .

    这意味着kotlin中的函数查找策略没有冒泡,只能找到自身包中的顶级函数 . 并且查找策略顺序为: local > enclosing > function > class > script > import statement > package top-level > star import statement > kotlin top-level .

    你可以简单地在调用站点函数中使用 CTRL+B / CTRL+ALT+B / F4 ,然后你可以跳转到实际调用函数的源代码,例如:

    fun foo(){
       println("bar");
       // ^--- move the cursor here and press `CTRL+B`/`CTRL+ALT+B`/`F4`
    }
    

相关问题