溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Java與Kotlin互調(diào)怎么實(shí)現(xiàn)

發(fā)布時(shí)間:2022-02-18 15:53:15 來(lái)源:億速云 閱讀:315 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要講解了“Java與Kotlin互調(diào)怎么實(shí)現(xiàn)”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“Java與Kotlin互調(diào)怎么實(shí)現(xiàn)”吧!

一、Kt調(diào)用-Java參數(shù)非null的處理

@NotNull

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

    public void toNull(String title){}
}

Kotlin中調(diào)用

Java與Kotlin互調(diào)怎么實(shí)現(xiàn)

二、Kt調(diào)用- Java中使用kt關(guān)鍵字聲明的變量和方法

kotlin中調(diào)用java方法,參數(shù)時(shí),如果含有Kotlin關(guān)鍵字,必須增加 反引號(hào) ``

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

}

Kotlin中調(diào)用

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

三、Kt調(diào)用Java-SAM轉(zhuǎn)換

在Kotlin中調(diào)用帶有接口參數(shù)的方法時(shí),如果這個(gè)接口只有一個(gè)方法,那么就可以通過(guò) lambda 表達(dá)式實(shí)現(xiàn) SAM轉(zhuǎn)換,從而簡(jiǎn)化我們的代碼。

示例如下:

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中調(diào)用

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

    }
    sam.noParameter({
            //如果更改一下java方法參數(shù)的順序,那么就會(huì)更簡(jiǎn)潔,如下
    },123)
    sam.noParameterClean(123){

    }
}

四、Kt中禁止Java調(diào)用某方法

@JvmSynthetic

Kotlin中,有些方法并不想暴露給Java調(diào)用,這時(shí)就可以增加這個(gè)注解在方法上。

@JvmSynthetic
fun toMain() {

}

此時(shí)toMain() 在Java中將無(wú)法調(diào)用到。

五、Java調(diào)用Kt-擴(kuò)展函數(shù)

@file:JvmName(“xx”)

在java中使用Kotlin的擴(kuò)展函數(shù)時(shí),我們都會(huì)使用相應(yīng)的類名+Kt 去調(diào)用相關(guān)的方法,有時(shí)候我們想自定義相應(yīng)的工具類,就顯得稍顯麻煩,如下:

比如我們有一個(gè)頂級(jí)擴(kuò)展函數(shù),位于 UiExpand.kt 中:

fun Int.px() {}

**Java中調(diào)用 **

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

如上所示,在Java中調(diào)用時(shí),我們必須已文件名+kt后綴才可以調(diào)用。

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

如下:

Ui.px()

六、Java調(diào)用kt-成員變量

@JvmField

在Java中,我們?nèi)フ{(diào)用Kotlin 的 成員變量 時(shí),編譯器都會(huì)幫我們自動(dòng)生成相應(yīng)的 get,set方法,這很符合Java Bean的寫法,但是有些是有我們只是想直接去調(diào)用,這個(gè)時(shí)候就可以這樣去做。

Kotlin

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

**Java中調(diào)用 **

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

當(dāng)然對(duì)于 如下的示例,就算不用增加上面的注解,在java也都是可以直接調(diào)用,免除get,set。

lateinit var sum: String

object UserPicCache{
        const val KEY_CACHE = "CACHE"
 }

@get:JvmName,@set:JvmName

有些時(shí)候,我們只是想讓其生成其中的一個(gè)set或者get方法,這個(gè)時(shí)候就可以使用上述注解。

Kotlin

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

Java中調(diào)用:

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

七、Java調(diào)用Kt-伴生對(duì)象

@JvmStatic

當(dāng)我們?cè)贘ava中調(diào)用 Kotlin 伴生對(duì)象的方法或者變量時(shí),必須通過(guò) 類名.Companion.xx 的方式才可以調(diào)用。這時(shí)候,我們就可以增加

@JvmStatic 來(lái)直接調(diào)用。

Kotlin

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

在Java中調(diào)用:

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

不過(guò)需要注意的是,@JvmStatic 對(duì)性能沒(méi)有任何提升,因?yàn)橄鄳?yīng)的,編譯器又生成了一個(gè)靜態(tài)方法,對(duì)于可變變量,會(huì)生成兩個(gè)靜態(tài)方法set,get。

Java與Kotlin互調(diào)怎么實(shí)現(xiàn)

八、Java調(diào)用Kt-方法默認(rèn)參數(shù)值

@JvmOverloads

在Kotlin中,對(duì)于方法參數(shù),我們可能會(huì)加入一些默認(rèn)值,便于更好的使用,但是在Java中,如果調(diào)用時(shí)不傳遞相應(yīng)的方法參數(shù),就會(huì)提示報(bào)錯(cuò),這種使用就可以使用@JvmOverloads 修飾方法。

kotlin

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

在java中調(diào)用

DialogUtils.showPromptDialog();
DialogUtils.showPromptDialog("標(biāo)題");

感謝各位的閱讀,以上就是“Java與Kotlin互調(diào)怎么實(shí)現(xiàn)”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)Java與Kotlin互調(diào)怎么實(shí)現(xiàn)這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI