假设我写了一个包含以下代码的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 回答
假设您的源文件夹中包含以下类:
main.kt
,test2.kt
和test3.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
,然后你可以跳转到实际调用函数的源代码,例如: