Java與Kotlin互調原理

一、Kt調用-Java參數非null的處理

@NotNull

class TestJava {
    public void toNotNull(@NotNull String title) {}

    public void toNull(String title){}
}

Kotlin中調用

二、Kt調用- Java中使用kt關鍵字聲明的變量和方法

kotlin中調用java方法,參數時,如果含有Kotlin關鍵字,必須增加 反引號 “

public Object object;
//使用kotlin中關鍵字命名的方法
public void is() {

}

Kotlin中調用

 testJava.`is`()
 testJava.`object`

三、Kt調用Java-SAM轉換

在Kotlin中調用帶有接口參數的方法時,如果這個接口隻有一個方法,那麼就可以通過 lambda 表達式實現 SAM轉換,從而簡化我們的代碼。

示例如下:

public class TestJavaSam {
  
    void singleFun(@NotNull IListener iListener) {}

    void noParameter( @NotNull IListener iListener,int sum) {}

    void noParameterClean(int sum,@NotNull IListener iListener) {}
}

interface IListener {
    void onClick();
}

在Kotlin中調用

fun main() {
    val sam = TestJavaSam()
    sam.singleFun {

    }
    sam.noParameter({
            //如果更改一下java方法參數的順序,那麼就會更簡潔,如下
    },123)
    sam.noParameterClean(123){

    }
}

四、Kt中禁止Java調用某方法

@JvmSynthetic

Kotlin中,有些方法並不想暴露給Java調用,這時就可以增加這個註解在方法上。

@JvmSynthetic
fun toMain() {

}

此時toMain() 在Java中將無法調用到。

五、Java調用Kt-擴展函數

@file:JvmName(“xx”)

在java中使用Kotlin的擴展函數時,我們都會使用相應的類名+Kt 去調用相關的方法,有時候我們想自定義相應的工具類,就顯得稍顯麻煩,如下:

比如我們有一個頂級擴展函數,位於 UiExpand.kt 中:

fun Int.px() {}

**Java中調用 **

  //Java調用kotlin類-(UiExpand)-Int.px() 擴展方法
  UiExpandKt.px(20);

如上所示,在Java中調用時,我們必須已文件名+kt後綴才可以調用。

通過給 UiExpand.kt 包名上增加 @file:JvmName(“Ui”),我們就可以實現自定義生成的類名去調用

如下:

Ui.px()

六、Java調用kt-成員變量

@JvmField

在Java中,我們去調用Kotlin 的 成員變量 時,編譯器都會幫我們自動生成相應的 get,set方法,這很符合Java Bean的寫法,但是有些是有我們隻是想直接去調用,這個時候就可以這樣去做。

Kotlin

data class TestKotlinBean(
  @JvmField val message: String, 
  @JvmField val title: String)

**Java中調用 **

 TestKotlinBean testKotlinBean = new TestKotlinBean("","");
 String message = testKotlinBean.message;
 String title = testKotlinBean.title;

當然對於 如下的示例,就算不用增加上面的註解,在java也都是可以直接調用,免除get,set

lateinit var sum: String

object UserPicCache{
        const val KEY_CACHE = "CACHE"
 }

@get:JvmName,@set:JvmName

有些時候,我們隻是想讓其生成其中的一個set或者get方法,這個時候就可以使用上述註解。

Kotlin

data class TestKotlinBean(
    @set:JvmName("setMessage")
    var message: String,
    @get:JvmName("getTitle")
    val title: String
)

Java中調用:

 TestKotlinBean testKotlinBean = new TestKotlinBean("", "");
 testKotlinBean.setMessage("message");
 testKotlinBean.getTitle();

七、Java調用Kt-伴生對象

@JvmStatic

當我們在Java中調用 Kotlin 伴生對象的方法或者變量時,必須通過 類名.Companion.xx 的方式才可以調用。這時候,我們就可以增加

@JvmStatic 來直接調用。

Kotlin

class Log {
    companion object {
        var time: String = ""
        fun toLog() {
        }
    }
}

在Java中調用:

 ToLog.toLog();
 ToLog.getTime();

不過需要註意的是,@JvmStatic 對性能沒有任何提升,因為相應的,編譯器又生成瞭一個靜態方法,對於可變變量,會生成兩個靜態方法set,get。

八、Java調用Kt-方法默認參數值

@JvmOverloads

在Kotlin中,對於方法參數,我們可能會加入一些默認值,便於更好的使用,但是在Java中,如果調用時不傳遞相應的方法參數,就會提示報錯,這種使用就可以使用@JvmOverloads 修飾方法。

kotlin

object DialogUtils {
    @JvmStatic
    @JvmOverloads
    fun showPromptDialog(title: String = "提示") {
    }
}

在java中調用

DialogUtils.showPromptDialog();
DialogUtils.showPromptDialog("標題");

到此這篇關於Java與Kotlin互調原理的文章就介紹到這瞭,更多相關Java與Kotlin互調內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: