从Java

时间:2017-06-04 07:20:03

标签: kotlin inline kotlin-interop

Exceptions.kt:

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

在kotlin:

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.
}

2 个答案:

答案 0 :(得分:11)

Java文件不支持由Kotlin编译器完成的内联,因为Java编译器不知道这种转换(请参阅this answer,了解为什么reified泛型根本不适用于Java)。

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

答案 1 :(得分:-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();