4

考虑以下 Java 类:

package javapkg;

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

    public void bar(JavaInterface ji) {
        ji.foo();
    }
}

Kotlin 代码使用此类的内部接口和 SAM 转换(注意它KotlinClass在不同的包中):

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 { }
    }
}

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

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

4

0 回答 0