Kotlin SAM转换与私有内部Java接口?

Kotlin SAM转换与私有内部Java接口?,java,kotlin,kotlin-interop,Java,Kotlin,Kotlin Interop,考虑以下Java类: package javapkg; public class JavaClass { private interface JavaInterface { void foo(); } public void bar(JavaInterface ji) { ji.foo(); } } 使用此类内部接口进行SAM转换的Kotlin代码(请注意,KotlinClass位于不同的包中): 现在,如果将内部JavaIn

考虑以下Java类:

package javapkg;

public class JavaClass {
    private interface JavaInterface {
        void foo();
    }

    public void bar(JavaInterface ji) {
        ji.foo();
    }
}
使用此类内部接口进行SAM转换的Kotlin代码(请注意,
KotlinClass
位于不同的包中):

现在,如果将内部
JavaInterface
公开,Kotlin代码(SAM转换和对象表达式)将在所有平台上正确编译和运行。由于
JavaClass
KotlinClass
在不同的包中,因此对象表达式在接口为私有的情况下无法编译,我猜SAM转换会失败,运行时异常也是出于同样的原因


我的问题:为什么SAM转换成功编译?似乎不应该这样做,因为接口是私有的,更糟糕的是,它在Kitkat中导致运行时异常。此外,对象表达式不会编译。这是Kotlin编译器中的错误,还是故意的?

我不知道为什么,但Java在公开公共接口上的私有类时没有错误。但是如果这个类是用Kotlin编写的,你就无法编译。这听起来像是Kotlin编译器中的一个bug。。。您可能希望在上打开一个问题
package kotlinpkg
import javapkg.JavaClass

class KotlinClass {
    fun f() {
        val jc = JavaClass()
        // Does not compile:
        // "Cannot access 'JavaInterface': it is private in 'JavaClass'"
        jc.bar(object : JavaClass.JavaInterface{
            override fun foo() { }
        })

        // Compiles and runs fine on Android Nougat, but throws
        // a NoClassDefFoundError exception on Kitkat
        jc.bar { }
    }
}