4

我想用具體化類型作爲擴展函數的功能,但我不認爲這是可能的,因爲在我檢查生成的字節碼後,我發現方法簽名是私人的,任何解決方法使它公開?Kotlin作爲函數擴展的函數類型函數 - 可從Java調用?

CommonExtensions.kt

inline fun<reified T: Activity> Context.startActivity() { 
    val intent = Intent(this, T:: class.java) 
    startActivity(intent) 
} 

fun View.visible() { 
    visibility = View.VISIBLE 
} 

科特林字節碼:

private final static startActivity(Landroid/content/Context;)V 
    @Lorg/jetbrains/annotations/NotNull;() // invisible, parameter 0 
    ... 

客戶端代碼:

科特林文件

override fun showMessageEmptyOfferFeeds() { 
     mOfferFeedsWarning.visible() // "visible()" extension func RESOLVED 
} 

的Java文件

showProfileDetailsUi(){ 
    startActivity<DetailActivity>() //"startActivity()" extension func NOT RESOLVED 
} 

回答

3

是的,你可以使用inline功能reified類型作爲擴展功能。這是private,以便Java代碼不能訪問它(順便說一句,「正常」inline功能不是這種情況)。 這種inline函數可以是private科特林因爲內聯函數複製的地方其中它們調用

example

inline fun <reified T : Activity> Activity.startActivity() { 
    startActivity(Intent(this, T::class.java)) 
} 

//usage 

startActivity<DetailActivity>() 

瞭解更多關於reified在另一個SO問題,我回答:https://stackoverflow.com/a/45952201/8073652

再次:不能使用inline功能與reified從Java類型。

+0

是的,它只是一個類的級別..但我不能用它在其中定義的文件的一面..我的問題是如何使用它作爲正常的擴展功能? – Abdellah

+0

嘗試將其定義爲最高級別。這是類似Extensions.kt的類,它可能只包含你的功能,沒有圍繞它的類 – s1m0nw1

+0

我做了但不工作 – Abdellah

2

inline reified功能 'disppear' 編譯後,因爲具體化的類型不JVM上的存在。這是編譯器的一個竅門。

也許唯一的原因是私有函數在那裏有一個錯誤,如果有人試圖在運行時覆蓋它,因爲reified函數是完全內聯的並且不能被覆蓋。

+2

嗨,它並沒有消失。它只是使隱藏的可見性,以避免Java代碼調用它。 –