Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当kotlin从android studio中的不同模块调用抽象java代码的子类时,将发生IllegaAccess错误_Java_Android_Kotlin - Fatal编程技术网

当kotlin从android studio中的不同模块调用抽象java代码的子类时,将发生IllegaAccess错误

当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

在AbstractClass前面添加public可以解决这个问题,但我不希望其他人访问AbstractClass。还有其他方法吗?

在Kotlin中,类及其祖先必须都可以从使用类访问。即使在Java中是允许的,从Kotlin调用此代码也会生成Java.lang.IllegalAccessError

如果检查反编译的Kotlin字节码以查找有问题的调用,则会在Java中得到以下结果:

//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()));