15

例外.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.
}
4

2 回答 2

18

Java 文件不支持 Kotlin 编译器完成的内联,因为 Java 编译器不知道这种转换(请参阅this answer about why reified generics do not work from Java at all)。

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

于 2017-06-04T07:33:10.357 回答
-1

是的,你可以做到

在 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();
于 2020-09-03T13:37:20.920 回答