У меня проблема с получением IllegalAccessError для следующего примера:
У меня есть базовый класс, объявленный в модуле gradle, который называется arch
abstract class BaseClass {
protected abstract val value: Int
fun run() {
Log.d("Printme", "value $value")
}
protected inline fun getMyValue(): Lazy<Int> = lazy {
getAnEight()
}
protected fun getAnEight() = 8
}
и дочерний класс, объявленный в модуле gradle, называется app
class ChildClass: BaseClass() {
override val value by getMyValue()
}
Стоит сказать, что я создаю проект Kotlin с использованием Android Studio, но все эти классы являются простыми Kotlin объектами без любые Android указанные c ссылки. Конечно, эти два модуля также имеют разные пакеты.
Теперь из моего основного метода ввода я делаю следующее (внутри app
модуля)
ChildClass().run()
Я звоню своему run()
метод объявлен в базовом классе, который обращается к ленивому инициированному свойству value
, которое в свою очередь вызывает метод getAnEight()
. Поскольку все методы защищены, я ожидаю, что нет причин, по которым дочерний класс не может вызывать все это. Даже если один из методов помечен как inline
и этот вызов заменен содержимым метода, он все равно сможет нормально вызывать getAnEight()
.
Вместо этого я получаю IllegalAccessError
, говоря BaseClass.getAnEight() is inaccessible to class ChildClass$$special$$inlined$getMeValue$1
. Эта проблема исчезает, когда я удаляю модификатор inline
или помещаю BaseClass
в тот же пакет, что и ChildClass
.
Это ошибка в Kotlin компиляторе? Или кто-то может объяснить мне это поведение, если оно работает как задумано? Заранее спасибо!