【发布时间】:2017-12-08 07:46:43
【问题描述】:
假设我编写了一个包含以下代码的 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.1 版开始)。 3) 或者,据我所知,Android Studio 对此有何评论?
【问题讨论】:
-
1.你可以测试一下。 2.
module CoolWithATwist是什么?你的意思是package CoolWithATwist?您需要导入类和函数才能使用它们。如果您这样做,那么您选择 使用该功能。没有什么能阻止您定义一个类 List,例如,它会影响 kotlin List 类。事实上,这种情况一直在发生。例如,JDK 有两个 List 类,许多其他类共享相同的名称。 -
@OliverCharlesworth,我愿意,谢谢。
-
就像你使用
import java.awt.*;一样。但明星导入是一种不好的做法,这是有充分理由的。 -
我也讨厌这样。这是我在首选项中禁用的功能之一。
-
但问题是,据我所知,在 Java 中,当您在范围内的两个不同包中拥有两个同名的函数时,您总是会被问到要使用哪一个。这似乎不会发生在这里。如果您导入 CoolWithATwist.*,IDE 不会询问您是否要使用 CoolWithATwist.println() 或 kotlin.io.println() 这对我来说似乎有点奇怪。请注意,我绝不是 Java 专家,所以我可能对导入的工作方式有误,但我看到 IntelliJ 经常问我要使用哪一个。在这种情况下它不会这样做。