В Kotlin класс и его предки должны быть доступны из класса using.Несмотря на то, что это разрешено в Java, вызов этого кода из Kotlin приведет к ошибке java.lang.IllegalAccessError.
Если вы проверите декомпилированный байт-код Kotlin для проблемного вызова, в Java вы получите следующее:
(new Invoker()).visit((AbstractClass)(new SubClass()));
Существует явное приведение к AbstractClass
, которое вызывает ошибку, поскольку она недоступна из вызывающего кода.Несмотря на то, что это приведение не является необходимым в Java, оно представлено Kotlin в скомпилированном байт-коде, который делает такой вызов неудачным.Нет другого пути, кроме как сделать AbstractClass
публичной.