jos*_*h42 5 java kotlin kotlin-interop
考虑以下 Java 类:
package javapkg;
public class JavaClass {
private interface JavaInterface {
void foo();
}
public void bar(JavaInterface ji) {
ji.foo();
}
}
Run Code Online (Sandbox Code Playgroud)
使用此类的内部接口进行 SAM 转换的 Kotlin 代码(请注意,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 { }
}
}
Run Code Online (Sandbox Code Playgroud)
现在,如果您将内部JavaInterface公开,Kotlin 代码(SAM 转换和对象表达式)将在所有平台上正确编译和运行。对象表达式无法使用私有接口进行编译,因为JavaClass和KotlinClass位于单独的包中,并且我猜测 SAM 转换会因相同原因而失败并出现运行时异常。
我的问题:为什么SAM转换能够成功编译?似乎不应该这样做,因为该接口是私有的,更糟糕的是它会导致 Kitkat 中的运行时异常。此外,对象表达式无法编译。这是 Kotlin 编译器中的错误,还是故意的?
| 归档时间: |
|
| 查看次数: |
222 次 |
| 最近记录: |