//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前面添加public可以解决该问题,但是我不希望别人访问AbstractClass。还有其他办法吗?
答案 0 :(得分:1)
在Kotlin中,必须可以从using类访问所有类及其祖先。即使Java允许,从Kotlin调用此代码也会产生java.lang.IllegalAccessError。
如果您检查反编译的Kotlin字节码中有问题的调用,则会在Java中获得以下信息:
(new Invoker()).visit((AbstractClass)(new SubClass()));
有一个到AbstractClass
的显式强制转换,这会导致错误,因为无法从调用代码中访问它。即使这种强制转换在Java中是不必要的,它还是由Kotlin在已编译的字节码中引入的,从而使此类调用失败。除了公开AbstractClass
之外,别无他法。