假设我写了一个包含以下代码的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)或者,据我所知,Android Studio,对此有何评论?
答案 0 :(得分: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.kt
,test2.kt
和test3.kt
将直接使用kotlin.io.println
。
test1.kt
将使用包顶级函数println
。
test.kt
将使用软件包顶级函数println
,因为星型导入语句优先级低于软件包顶级范围。
这意味着kotlin中的函数查找策略没有冒泡,只能找到自身包中的顶级函数。并且查找策略顺序为:local
&gt; enclosing
&gt; function
&gt; class
&gt; script
&gt; import statement
&gt; package top-level
&gt; star import statement
&gt; kotlin top-level
。
您只需在调用站点函数中使用CTRL+B
/ CTRL+ALT+B
/ F4
,然后就可以跳转到实际调用该函数的源代码,例如:< / p>
fun foo(){
println("bar");
// ^--- move the cursor here and press `CTRL+B`/`CTRL+ALT+B`/`F4`
}