когда kotlin вызывает подкласс абстрактного кода Java из другого модуля в Android Studio, возникает ошибка недопустимого доступа

#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 общедоступным.