私有可见性修饰符和子包
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.*
而不是显式导入栏。
所以我最近开始尝试使用 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.*
而不是显式导入栏。