从Java调用Kotlin内联函数

ari*_*tll 10 inline kotlin kotlin-interop

Exceptions.kt:

@Suppress("NOTHING_TO_INLINE")
inline fun generateStyleNotCorrectException(key: String, value: String) =
        AOPException(key + " = " + value)
Run Code Online (Sandbox Code Playgroud)

在kotlin:

fun inKotlin(key: String, value: String) {
    throw generateStyleNotCorrectException(key, value) }
Run Code Online (Sandbox Code Playgroud)

它在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.
}
Run Code Online (Sandbox Code Playgroud)

zsm*_*b13 13

Java文件不支持由Kotlin编译器完成的内联,因为Java编译器不知道这种转换(请参阅此答案,了解为什么reified generics根本无法使用Java).

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