首頁 > 軟體

Java與Kotlin互調原理

2022-02-18 13:00:03

一、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互調內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com