【问题标题】:Is there a way of limiting stdlib functions' visibility in Kotlin?有没有办法限制标准库函数在 Kotlin 中的可见性?
【发布时间】:2017-07-04 01:37:24
【问题描述】:

Kotlin 附带了许多标准库函数,其中很多函数在默认情况下是可见的,而无需实际导入它们。因此,listOfarrayListOfArrayList<T>() 等函数实际上已插入到全局命名空间中。是否有可以禁用此行为的编译器标志?

【问题讨论】:

  • 您的问题已在下面得到解答,但您能评论一下为什么您希望这样做吗?
  • 感觉像是一个潜在的错误来源。有一堆具有相当通用名称的函数有效地贴在全局命名空间中,当您隐藏一个时编译器不会发出警告。它应该会使用您的函数定义,但即使这样也感觉有点不一致,因为对于将被忽略的类/对象扩展函数实际上并非如此(尽管在这种情况下至少编译器会发出警告) .
  • 我认为这应该不是问题。您只是不应该创建与标准库函数具有相同签名的函数。就像您不应该创建与 Java 标准库中的类同名的类(例如 IntegerStringArrayList)。
  • 是的,或者与标准库类具有相同签名的类...我不知道,我想我只是有点喜欢 C++ 命名空间,它们感觉更干净。
  • 也许要进一步澄清...据我所知,我可能会在 Kotlin 模块中做这样的事情:fun <T> println(x: T) = kotlin.io.println("Print an empty line, I dare you"),然后是 fun println() = sudoRmRfDash() 或替代 fun println() = solveTSPFor100NodesAndEmailMe("my@email.com")如果导入我的库,用户实际上会使用它,作为 .class 分发?还是我在这里遗漏了什么?

标签: intellij-idea kotlin kotlinc


【解决方案1】:

很遗憾,你不能。就像你不能在 java 中禁止自动导入的 java.lang 包一样。

您无需担心自动导入的顶级函数。如果您不使用任何顶级函数,则不会向 Java 字节码发出类引用/方法引用。并且所有的*arrayOf 函数都将转换为Java数组创建,例如:

Kotlin          |        Java
------------------------------------
byteArrayOf     |    new byte[]
------------------------------------
shortArrayOf    |    new short[]
------------------------------------
intArrayOf      |    new int[]
------------------------------------
longArrayOf     |    new long[]
------------------------------------
floatArrayOf    |    new float[]
------------------------------------
doubleArrayOf   |    new double[]
------------------------------------
charArrayOf     |    new char[]
------------------------------------
booleanArrayOf  |    new boolean[]
------------------------------------
arrayOf<T>      |    new T[]
------------------------------------

【讨论】:

  • 我明白这一点,但我想,本质上,让 IntelliJ 限制“全局命名空间污染”,以便如果我实际上使用标准库中的函数/类,它需要导入。有没有办法做到这一点?
  • stdlib 中的很多顶级函数只是普通函数,编译器并没有对它们做任何优化。
  • @Ilya 我说的是导入语句将被优化而不是函数。你确定你已经看到了完整的答案。
  • import 语句本身不会产生任何字节码,所以我不明白如何在编译时对其进行“优化”。
  • @Andrej 对不起,先生。由于我的英语不好,也许我把你弄糊涂了,但我想传达的是类引用不会发送到 Java 字节码。现在怎么样?
猜你喜欢
  • 2020-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-02
  • 1970-01-01
相关资源
最近更新 更多