когда kotlin вызывает подкласс абстрактного Java-кода из другого модуля в Android-студии IllegalAccessError происходит - PullRequest
1 голос
/ 24 апреля 2019
//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 Ответ

1 голос
/ 24 апреля 2019

В Kotlin класс и его предки должны быть доступны из класса using.Несмотря на то, что это разрешено в Java, вызов этого кода из Kotlin приведет к ошибке java.lang.IllegalAccessError.

Если вы проверите декомпилированный байт-код Kotlin для проблемного вызова, в Java вы получите следующее:

(new Invoker()).visit((AbstractClass)(new SubClass()));

Существует явное приведение к AbstractClass, которое вызывает ошибку, поскольку она недоступна из вызывающего кода.Несмотря на то, что это приведение не является необходимым в Java, оно представлено Kotlin в скомпилированном байт-коде, который делает такой вызов неудачным.Нет другого пути, кроме как сделать AbstractClass публичной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...