Kotlin SAM运行时错误:NoSuchMethodError:没有静态方法

dpo*_*sch 5 kotlin

今天我在开发涉及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)

所以我的问题是:

  1. 为什么会发生这种行为?
  2. 如果它正在发生,为什么编译器不会引发错误?

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)