私有可见性修饰符和子包

private visibility modifier and subpackages

所以我最近开始尝试使用 Kotlin,我偶然发现了这个:

If a top-level declaration is marked private, it is private to the package it’s declared in (see Visibility Modifiers). Since packages really nest in Kotlin, i.e. package foo.bar is considered a member of foo, if something is private in a package, it is visible to all its subpackages.

Note that members of outer packages are not imported by default, i.e. in a file in package foo.bar we can’t access members of foo without importing them. From: Visibility and Package Nesting

那么让我们考虑以下示例:

File1.kt

package foo

private fun bar() = println("This is bar!!!")

File2.kt

package foo.baz

import foo.bar

fun main(args: Array<String>) = bar()

据我了解,函数 bar() 应该在包 foo.baz 中可见,因此可以从 main() 调用。但是当我尝试编译上面的内容时,我收到以下错误消息:

错误:Kotlin:无法访问'bar':它是'private' in 'foo'

这是一个错误还是语言规范已更新但文档尚未更新?我错过了什么吗?

提前致谢。

我们最近更改了可见性规则,因此包不再嵌套。所以这不是编译器中的错误,而是文档中的错误

虽然可能如 Andrey Breslav 所写,规则已更改,但即使是版本 0.12.1218 和 0.12.200,您仍然可以使用您的代码。

既然规则已经改变,你不应该这样做,但如果你真的想这样做,只需将你的导入语句更改为: import foo.* 而不是显式导入栏。