今天我在开发涉及SAM转换和子类的kotlin/android时遇到了一个非常奇怪的运行时错误.
这是纯java + kotlin的最小例子.这是两个java类:
public class A {
public interface I {
public void f();
}
public I i;
}
public class B extends A {}
Run Code Online (Sandbox Code Playgroud)
这是一个kotlin主要功能:
fun main(args: Array<String>) {
A().i = B.I {}
}
Run Code Online (Sandbox Code Playgroud)
这段代码编译得很好,但在运行时我收到以下错误:
Exception in thread "main" java.lang.NoSuchMethodError: B.I(Lkotlin/jvm/functions/Function0;)LA$I;
at MainKt.main(Main.kt:2)
Run Code Online (Sandbox Code Playgroud)
现在,这已经很糟糕了 - 如果像这样的代码不起作用(我猜不会),编译器应该引发错误.但至少有一个人可能会说I通过子类B而不是定义的位置引用接口是个坏主意A(即A.I).
但是,如果此代码位于B我可以I直接引用的子类中,则不太清楚I:
class C: B {
constructor() {
this.i = I {}
}
}
Run Code Online (Sandbox Code Playgroud)
所以我的问题是:
PS:在android中,错误消息看起来与此类似,这更令人困惑:
Caused by: java.lang.NoSuchMethodError: No static method OnFocusChangeListener(Lkotlin/jvm/functions/Function2;)Landroid/view/View$OnFocusChangeListener; in class Landroid/widget/LinearLayout; or its super classes (declaration of 'android.widget.LinearLayout' appears in /system/framework/framework.jar:classes2.dex)
Run Code Online (Sandbox Code Playgroud)
小智 0
将 main 方法定义为静态方法,例如
companion object {
@JvmStatic fun main(args: Array<String>) {
A().i = B.I {}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
566 次 |
| 最近记录: |