2017-06-04 162 views
0

Exceptions.kt內聯函數:呼叫科特林從Java

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

在科特林:

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

它工作在科特林和內聯函數。

但在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. 
} 
+3

爲什麼會首先期望Java編譯器可以神奇地內聯函數? Java知道Java方法。它應該如何知道其他語言的概念? – GhostCat

回答

5

這年代由科特林編譯器完成不支持Java文件,因爲Java編譯器不知道這種轉變(見this answer爲什麼物化仿製藥沒有從工作的內聯Java)。

至於其他內聯使用情況(通常以lambda作爲參數傳遞時),正如您已經發現的那樣,字節碼包含一個public static方法,以便仍可從Java調用內聯函數。但是,在這種情況下,不會發生內聯。