当kotlin从android studio中的不同模块调用抽象java代码的子类时,将发生IllegaAccess错误
在AbstractClass前面添加public可以解决这个问题,但我不希望其他人访问AbstractClass。还有其他方法吗?在Kotlin中,类及其祖先必须都可以从使用类访问。即使在Java中是允许的,从Kotlin调用此代码也会生成Java.lang.IllegalAccessError 如果检查反编译的Kotlin字节码以查找有问题的调用,则会在Java中得到以下结果:当kotlin从android studio中的不同模块调用抽象java代码的子类时,将发生IllegaAccess错误,java,android,kotlin,Java,Android,Kotlin,在AbstractClass前面添加public可以解决这个问题,但我不希望其他人访问AbstractClass。还有其他方法吗?在Kotlin中,类及其祖先必须都可以从使用类访问。即使在Java中是允许的,从Kotlin调用此代码也会生成Java.lang.IllegalAccessError 如果检查反编译的Kotlin字节码以查找有问题的调用,则会在Java中得到以下结果: //module A in java abstract class AbstractClass { pub
//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
有一个显式转换到AbstractClass
,这导致了错误,因为调用代码无法访问该转换。尽管这种强制转换在Java中是不必要的,但它是由Kotlin在编译的字节码中引入的,这使得这种调用失败。除了将AbstractClass
公开之外,没有其他方法可以解决这个问题
(new Invoker()).visit((AbstractClass)(new SubClass()));