Function Kotlin顶级功能范围&;阴影

Function Kotlin顶级功能范围&;阴影,function,scope,kotlin,Function,Scope,Kotlin,假设我编写了一个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 } package CoolWith

假设我编写了一个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
}
package CoolWithATwist
//在线性时间内求解TSP的代码,后跟以下内容:
fun println(x:T){
kotlin.io.println(x)
haltAndCatchFire()//或任何恼人/破坏性功能
}
如果包以字节码形式分发,我假设Kotlin关于按照默认导入标准库模块的规则以及随后导入另一个模块(如CoolWithATwist)的规则实际上会影响标准库自动包含的println函数,因此如果用户实际调用println,则会执行上述代码,这对吗


既然Kotlin编译器没有警告隐藏全局函数或必须显式命名您实际调用的函数,IntelliJ Idea上的Kotlin插件(从1.1.3版开始)或据我所知,Android Studio上的Kotlin插件也没有警告,那么最好的检测方法是什么,有什么要说的吗?

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

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
,因为star导入语句优先级低于包顶级范围

这意味着kotlin中的函数查找策略没有冒泡,只在其自身包中查找顶级函数。查找策略顺序为:
local
封装
脚本
导入语句
包顶级
星型导入语句
科特林顶级

您只需在调用站点函数中使用
CTRL+B
/
CTRL+ALT+B
/
F4
,即可跳转到实际调用该函数的源代码,例如:

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

1.你可以试一下。2.什么是
模块CoolWithWist
?你的意思是
包装冷却带扭曲
?您需要导入类和函数才能使用它们。如果您这样做,那么您选择使用该功能。没有什么可以阻止您定义一个类列表,例如隐藏kotlin列表类。事实上,这种情况一直都在发生。例如,JDK有两个列表类,许多其他类共享相同的名称。@OliverCharlesworth,我有,谢谢。就像您使用
import java.awt.*一样。但明星进口是一种不好的做法,有一个很好的理由。我也讨厌这种做法。这是我在首选项中禁用的内容之一,但在Java中,据我所知,当您在作用域中的两个不同包中有两个同名函数时,您总是会被询问要使用哪一个。这在这里似乎没有发生。如果导入CoolWithATwist.*,IDE不会询问您是否要使用CoolWithATwist.println()或kotlin.io.println(),这对我来说似乎有点奇怪。请注意,我绝不是Java专家,所以我可能对导入的工作方式有误解,但我看到IntelliJ经常问我应该使用哪一种。在这种情况下它不起作用。