【问题标题】:Does "internal" visibility modifier in Kotlin work yet?Kotlin 中的“内部”可见性修饰符是否有效?
【发布时间】:2015-09-06 21:46:23
【问题描述】:

假设 Kotlin 中的模块意味着一个项目(尽管最好了解 Kotlin 模块的确切定义是什么意思......从文档中不清楚)...

Kotlin 可见性修饰符是否有效。我有两个项目,一个主项目和一个测试项目,具有不同的、非重叠的包路径。测试项目依赖于主项目(在 Eclipse 中)。主项目中的接口或类是否标记public似乎并不重要。在测试项目中,主要项目接口/类无论如何都是可见/可访问的。如果您将主要项目标记为private,那么唯一的区别就会出现,然后就会出现可见性问题。但不管有没有public,它似乎都没有任何区别。

从我从文档中可以看出,在接口或类上省略可见性修饰符会影响默认可见性,即internal

【问题讨论】:

  • 至少对于 Gradle,他们没有。我尝试创建一个模块依赖于另一个模块的多模块项目,即使我将模块a 中的类A 明确标记为internal,它在模块b 中仍然可见。
  • 默认可见性现在是publicinternal 必须明确指定。

标签: kotlin


【解决方案1】:

在当前的 Kotlin 中,internal 可见性修饰符确实被强制执行了。

Kotlin 1.0 Beta RC announcement 中写道:

可见性检查受到限制,例如,公共声明不能公开本地、私有或内部类型。在编译器和 IDE 中检查对内部声明的访问;

related release notes 有两点支持这一点:

  • 在编译器中检查了内部可见性
  • 内部函数和属性的名称被破坏(java 互操作)

最后一点对于帮助防止 Java 看到内部范围的标识符并与之交互至关重要。

Kotlin M14 release announcement 中还提到:

  • 在编译器中检查内部(不仅是 IDE)
  • 接口中禁止受保护成员和内部成员

Kotlin M13 release announcement 还显示:

  • 现在在模块外部检查对内部的访问(详情如下);
  • 默认可见性(无修饰符)从内部更改为公共,
  • 我们终于启用了拒绝在模块外部使用内部声明的检查。

所以它显然可以正常工作。

【讨论】:

    【解决方案2】:

    值得注意的一点是它仅适用于 Kotlin 模块,但仍然可以从 Java 模块访问“内部”声明,尽管它会显示检查报告(警告)。

    https://youtrack.jetbrains.com/issue/KT-19053

    【讨论】:

      猜你喜欢
      • 2014-11-06
      • 2019-04-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-18
      • 2020-12-15
      • 1970-01-01
      • 2019-02-22
      • 2019-07-03
      相关资源
      最近更新 更多