2015-07-22 2 views
5

Так что я недавно начал экспериментировать с Котлин, и я наткнулся на это:частный модификатор видимости и подпакеты

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() 

Из того, что я понимаю, панель функций() должна быть видимой в пакете foo.baz и, следовательно, быть вызванной из main(). Но когда я пытаюсь скомпилировать выше, я получаю следующее сообщение об ошибке:

Ошибка: Котлин: Не удается получить доступ к «бар»: это «частный» в «Foo»

Является ли это ошибка или имеет спецификация языка была обновлена, а документации нет? Я что-то упускаю?

Заранее спасибо.

ответ

6

Недавно мы изменили правила видимости, чтобы пакеты больше не гнездились. Так что это не ошибка в компиляторе, а в документах

+0

Спасибо, но, пожалуйста, запомните эти изменения. Итак, как теперь работают модификаторы видимости на уровне пакетов/верхнего уровня? – feugatos

+0

Пакеты не гнездятся, то есть частные в одном пакете не отображаются в другом. –

+1

Кроме того, 'private' скоро будет изменен, чтобы быть видимым не в пакете, но в объявленном файле –

-1

Хотя, возможно, Андрей Бреслав написал, что правила изменились, вы все равно можете использовать свой код даже с версией 0.12.1218 и 0.12.200.

Поскольку правила были изменены, вы не должны этого делать, но если вы действительно хотите это сделать, просто измените свой оператор импорта на: import foo.* вместо того, чтобы явно импортировать панель.

+1

Но почему это разрешено? Должен импортировать foo. * исключить и частных членов? В конце концов я не могу явно импортировать foo.bar. – feugatos

+0

Я понятия не имею, я просто обнаружил это по совпадению, играя с вашим кодом. Я предполагаю, что они заблокировали его программным способом, вместо того, чтобы полностью отключить эту функцию, и она не покрывала глобус. – Onizuka89

Смежные вопросы