从Java调用Kotlin内联函数

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

Kotlin编译器所做的内联不支持Java文件,因为Java编译器并不知道这种转换(请参阅关于为什么泛型泛型不能从Java工作的答案 )。

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