从 Java 调用 Kotlin 内联函数

Call Kotlin inline function from Java

Exceptions.kt:

@Suppress("NOTHING_TO_INLINE")
inline fun generateStyleNotCorrectException(key: String, value: String) =
        AOPException(key + " = " + value)

在科特林中:

fun inKotlin(key: String, value: String) {
    throw generateStyleNotCorrectException(key, value) }

在kotlin中有效,函数是内联的。

但是在Java代码中使用时,就是不能内联, 并且仍然一个普通的静态方法调用(从反编译的内容看)。

像这样:

public static final void inJava(String key, String value) throws AOPException {
    throw ExceptionsKt.generateStyleNotCorrectException(key, value);
// when decompiled, it has the same contents as before , not the inlined contents.
}

Java 文件不支持 Kotlin 编译器完成的内联,因为 Java 编译器不知道这种转换(请参阅 为什么具体化泛型不从 Java 开始工作。

至于内联的其他用例(最常见的是将 lambda 作为参数传递时),正如您已经发现的那样,字节码包含一个 public static 方法,因此内联函数仍然可以来自 Java。但是,在这种情况下,不会发生内联。

是的,你能做到

在 Kotlin 文件中:

    Builder.sendEvent { event ->
                    YandexMetrica.reportEvent(event)
                }
                .build();

在 Java 文件中:

    Builder.sendEvent(new Function1<String, Unit>() {
                    @Override
                    public Unit invoke(String event) {
                        Log.i("TEST", event);
                        return null;
                    }
                })
                .build();