中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java與Kotlin怎么實現交互

發布時間:2021-07-23 16:58:07 來源:億速云 閱讀:138 作者:Leah 欄目:編程語言

Java與Kotlin怎么實現交互,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

kotlin調用java

可空性(Nullability)

Java默認有數值可空性而kotlin沒有,所以在調用Java的方法的時候不知道會不會收到空值。所以我們在Kotlin中調用Java的時候需要添加 ?或者 !來告訴Kotlin有可能出現空值。

比如這里有一個Java方法,接受一組字符串后返回一組做字符串:

public Set<String> toSet(Collection<String> elements){ //TODO}

那么Kotlin在調用的時候是不能確定輸入和輸出是否可為空的。就需要使用?或者 !來輔助判斷。

為了方便Kotlin調用,我們通常使用 @NotNull 注解來標識Java代碼的非原始參數、字段、返回值。

@NotNullSet<@NotNull String> toSet(@NotNull Collection<@NotNull String> elements){ //TODO}

這個Kotlin在調用的時候就明確知道不能為空,這里我們使用的是jetBrain的 @NotNull注解,當然還有其他選擇,如下圖:

這里還是推薦使用JetBrain或者Android的注解。

前綴屬性:(getter、setter)

如果是使用Java bean,那么我們在Kotlin中調用就沒有什么問題。

如果你的空參數方法是以get開頭的,那么Kotlin就知道這是getter,就可以通過屬性名來訪問它。

相同的如果是由set開頭的單一參數方法,那么Kotlin就知道這是setter,就通過屬性名直接賦值。

當然is的工作原理也是和它們類似的。

我們定義一個Java bean:

class User {  private String name; private int age; public String getName() {  return name; } public void setName(String name) {  this.name = name; } public int getAge() {  return age; } public void setAge(int age) {  this.age = age; }}

Kotlin中訪問

val user = User()user.name = "四爺" //賦值val age = user.age //獲取age字段值

關鍵字(keywords)

kotlin中有很多系統定義的關鍵字如 fun is in objects、typeof、val、var、when、typealias等。

這些關鍵字在java是可以被使用的,但是在kotlin卻是不行的。

函數或者參數使用了這些關鍵字,那么kotlin在調用的時候會出現一些問題,比如Java中定義了一個方法名叫 is 的方法。那么在Kotlin中直接調用就會報錯。

那么最簡單的方法就是重命名Java方法,但如果調用的是三方庫的方法,就很難去重命名了。所以我們另一種解決方式是在Kotlin調用java方法的時候加上 `` 反引號來使用。

Utils.`is`()

但是我們如果能重命名還是重命名,以防止代碼出現太多的符號。

避免在任何擴展方法和擴展屬性上使用Any

運算符重載(operator Overloading)

在Java不存在運算符重載,而kotlin有。比如:

a+b => a.plus(b)

在kotlin中將運算符 + 翻譯為了方法 plus。

如果在Java中使用了同樣的方法名稱,比如 加(plus)、 減(minus)或者其他運算符名稱,那么請務必確保他們與運算符兼容,避免意外調用他們。

Java調用Kotlin

JvmName & JvmMultifileClass

當我們在遷移的時候會將Java的工具類翻譯為Kotlin拓展函數或者頂層函數。但是這樣處理之后,在Java文件中是無法直接調用的,此時我們需要加注解 @file:JvmName(“文件名稱”):

Ext.kt文件

@file:JvmName("ExtUtils")package com.demo.javaAndKotlinfun a(): String { ...}fun b(): String { ...}

這里我們將名稱命名為ExtUtils。此外,我們可能還有其他的頂層函數或者擴展函數。按照上面這種方式我們也可以指定一個其他的名稱,但是如果我們也想使用ExtUtils這個名稱的時候會報錯:

Duplicate JVM class name

此時我們需要在不同的文件中加入新的注解 @file:JvmMultifileClass 。意思是將所有的文件合并到一個新的名稱為ExtUtils文件中。

ExtOther.kt文件

@file:JvmMultifileClass@file:JvmName("ExtUtils")package com.demo.javaAndKotlinfun c(str: Any): String { ...}

我們在Ext.kt文件中也加入@file:JvmMultifileClass注解,我們就可以在Java文件中直接使用ExtUtils來調用 a(),b(),c()方法了。

JvmField

在 kotlin中我們使用的數據類即 data class 是不需要指定getter和setter的,可以直接通過字段名來訪問它們。但是如果是在Java文件中調用data class依舊是需要使用getter和setter方法進行調用的。這里我們是可以修改他們的,那就是使用 @JvmField 注解,通過注解,可以直接將字段暴露出去進行訪問。

data class Person( @JvmField var name: String, @JvmField var age: Int)//java中調用Person person = new Person("",1);person.name = "";person.age = 10;

但是也有例外就是lateinit修飾的字段會自動暴露,無需指定@JvmField注解。還有const修飾的字段也是一樣會自動暴露。

另外,如果我們想在Java中調用setName的時候修改這個屬性名稱不叫setName,這里我們需要使用@set:JvmName 注解。同理修改getName使用@get:JvmName 。需要注意的是,指定了@set:JvmName或者@get:JvmName注解后不需要在指定@JvmField了。

data class Person( @set:JvmName("changeName") var name: String, @JvmField var age: Int, @get:JvmName("likesPink") var likesPink: Boolean){ lateinit var address:String}

JvmStatic

當我們將Java文件的靜態方法遷移到Kotlin中時,我們會將其放在 companion object中,但是這樣處理之后在Java文件中無法直接調用,得通過companion對象實例方法來調用。

class MyService { internal fun doWork() {  ... } companion object {  fun schedule(context: Context) {   ...  } }}//在Java中調用MyService.Companion.schedule(this);

幸運的是Kotlin提供了 @JvmStatic 注解。他會讓Kotlin在編譯器完成類封裝后生成一個靜態方法。

class MyService { internal fun doWork() {  ... } companion object {   @JvmStatic  fun schedule(context: Context) {   ...  } }}//在Java中調用MyService.schedule(this);

JvmOverloads

在Kotlin中我們可以給函數的參數設置默認值,即默認參數。但是這個功能在Java中是沒有的。如果不做任何處理,那么在Java中調用函數的時候,就必須每個參數都要傳入。那么我們設置的默認參數就沒有任何意義了。

所以,Kotlin給我們提供了 @JvmOverloads注解,使用這個注解后,會讓Kotlin編譯器按照從左向右的順序依次為每一個可選參數生成重載。

@JvmOverloadsfun Bitmap.resize(width: Int, height: Int = 200) {}//java調用ExtUtils.resize(bitmap,100);

這里我們在Kotlin中很容易就理解了Bitmap.resize方法的含義,但是ExtUtils.resize這樣調用的時候,方法名不夠明確。所以我們可以使用@JvmName注解來指定名稱。

@JvmName("resizeBitmap")@JvmOverloadsfun Bitmap.resize(width: Int, height: Int = 200) {}//java調用ExtUtils.resizeBitmap(bitmap,100);

關于Java與Kotlin怎么實現交互問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

聂拉木县| 泉州市| 徐闻县| 蓬莱市| 阳江市| 分宜县| 乳山市| 辽中县| 周至县| 芦溪县| 措勤县| 罗山县| 视频| 米易县| 务川| 黄石市| 普兰县| 手游| 莱芜市| 凯里市| 图们市| 白银市| 宁海县| 开封市| 余江县| 永丰县| 万载县| 东辽县| 霍州市| 磐石市| 阳曲县| 丰原市| 个旧市| 永兴县| 香港| 博湖县| 榕江县| 大悟县| 海城市| 芦山县| 讷河市|