#java #android #kotlin
#java #Android #kotlin
Вопрос:
//module A in java
abstract class AbstractClass {
public abstract void foo();
}
public class SubClass extends AbstractClass {
@Override
public void foo() {
Log.v("x","-----------------");
}
}
public class Invoker {
public void visit(AbstractClass a){
a.foo();
}
}
//module B in kotlin
SubClass().foo() // it works
Invoker().visit(SubClass()) // java.lang.IllegalAccessError occur
добавление public перед AbstractClass решит проблему, но я не хочу, чтобы к AbstractClass обращались другие. Есть ли другой способ?
Ответ №1:
В Kotlin класс и его предки должны быть доступны из класса using. Даже если это разрешено в Java, вызов этого кода из Kotlin приведет к созданию java.lang.Ошибка IllegalAccessError.
Если вы проверите декомпилированный байт-код Kotlin на предмет проблемного вызова, вы получите следующее в Java:
(new Invoker()).visit((AbstractClass)(new SubClass()));
Существует явное приведение к AbstractClass
, которое вызывает ошибку, поскольку оно недоступно из вызывающего кода. Несмотря на то, что в Java это приведение не требуется, оно вводится Kotlin в скомпилированный байт-код, что приводит к сбою такого вызова. Нет другого способа обойти это, кроме как сделать AbstractClass
общедоступным.