Kotlin與Java混合開發(fā)(2)??Kotlin調(diào)用Java

  • 避免 kotlin 關(guān)鍵字
  • 平臺(tái)類型與空值
  • 異常檢查
  • 調(diào)用 Java 函數(shù)式接口

??混合編程包含兩個(gè)方面:Kotlin 調(diào)用 JavaJava 調(diào)用 Kotlin扶镀。

避免 kotlin 關(guān)鍵字

??因?yàn)?Kotlin 出現(xiàn)的比 Java 要晚許多尊沸,所以在 Java 程序員在給 Java 標(biāo)識(shí)符命名時(shí)并沒有考慮到哪些是 Kotlin 的關(guān)鍵字滔吠。但在 Kotlin 中調(diào)用這樣的 Java 代碼時(shí),則需要將這些關(guān)鍵字用 反引號(hào)(`) 括起來七冲。例如 Java 標(biāo)準(zhǔn)輸出流 System.in亲配,如果在 Kotlin 中調(diào)用則需要表示為 System.`in`蔓涧。

// JavaClass.java
public class JavaClass {
    public static JavaClass object = new JavaClass();

    @Override
    public String toString() {
        return this.getClass().getSimpleName();
    }
}
// main.kt
fun main(args: Array<String>?) {
    val obj = JavaClass.`object`
    println(obj)
}
// 運(yùn)行結(jié)果:
JavaClass
Process finished with exit code 0

平臺(tái)類型與空值

??前面提到過 平臺(tái)類型构灸,這些類型在 Java 中聲明了一個(gè)變量或者返回值蚪拦,它的類型可能為空,也可能非空冻押。Kotlin 在調(diào)用它們時(shí)會(huì)放棄類型檢查。

// Person.java
public class Person {
    private String name = "小三";
    private int age = 20;
    private Date birthDate; // 未初始化盛嘿,為空值 null

    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;
    }

    public Date getBirthDate() {
        return birthDate;
    }

    public void setBirthDate(Date birthDate) {
        this.birthDate = birthDate;
    }
}
// mian.kt
fun main(args: Array<String>?) {
    val person = Person()
    val date = person.birthDate // 1?? 編譯器自動(dòng)推導(dǎo)洛巢,為平臺(tái)類型
    println("date = $date")

    val date1: Date? = person.birthDate // 指定類型Date?,可為空類型
    println("date1 = $date1")

    val date2: Date = person.birthDate // 2??指定類型Date次兆,不能為空稿茉。
    println("date2 = $date2")
}
// 運(yùn)行結(jié)果
date = null
date1 = null
Exception in thread "main" java.lang.IllegalStateException: person.birthDate must not be null
    at cn.ak.kotmodule.WwwwKt.main(wwww.kt:21)

??上面編寫了一個(gè) Java 類 Person,它的 birthDate 字段沒有初始化所以為空值。在 Kotlin 中通過屬性訪問 Java 中的 settergetter 函數(shù)漓库,代碼第1??行讀取 birthDate 屬性賦值給變量 date恃慧,此時(shí) date 的類型是由編譯器自動(dòng)推導(dǎo)出來的,所以 IntelliJ IDEA IDE 表示的平臺(tái)類型是 Date!渺蒿,它可以接收空值痢士。
??但是如果明確指定返回值類型,可以使用 Date?Date茂装。由于 Date? 是可空類型怠蹂,date1 可以接收空值,而 date2 是非空類型少态,不能接收空值城侧,因此代碼第2??行會(huì)發(fā)生異常。

我們將上面 mian.kt 反編譯回 Java 文件會(huì)是什么樣子彼妻?

   public static final void main(@Nullable String[] args) {
      Person person = new Person();
      // 賦值嫌佑,但未對(duì)date空值檢查
      Date date = person.getBirthDate(); 
      String var3 = "date = " + date;
      boolean var4 = false;
      System.out.println(var3);
      // 賦值,但未對(duì)date1空值檢查
      Date date1 = person.getBirthDate();  
      String var8 = "date1 = " + date1;
      boolean var5 = false;
      System.out.println(var8);
      // 臨時(shí)獲取birthDate值存儲(chǔ)在臨時(shí)變量var10000中
      Date var10000 = person.getBirthDate();  
      // 如果var10000這個(gè)臨時(shí)變量是空值侨歉,拋出異常
      Intrinsics.checkExpressionValueIsNotNull(var10000, "person.birthDate"); 
      // 使用var10000值對(duì) date2 初始化
      Date date2 = var10000;  
      String var10 = "date2 = " + date2;
      boolean var6 = false;
      System.out.println(var10);
   }

??從反編譯后的代碼可以看出屋摇,datedate1 都沒有做空值的檢查,只有 date2 通過代碼 Intrinsics.checkExpressionValueIsNotNull(var10000, "person.birthDate"); 檢查了空值为肮,并且是空值會(huì)拋出異常摊册。

異常檢查

??Kotlin 和 Java 在異常檢查上有很大的不同,Java 有受檢查異常颊艳,而 Kotlin 中沒有受檢查異常茅特。那么當(dāng) Kotlin 調(diào)用 Java 中的一個(gè)函數(shù)時(shí),這個(gè)函數(shù)聲明拋出異常棋枕,那么 Kotlin 會(huì)如何處理白修?

fun main(args: Array<String>?) {
    try {
        InputStreamReader(System.`in`).use { isr ->  // 1??
            BufferedReader(isr).use { reader ->      // 2??
                val command = reader.readLine()      // 3??
                println(command)
            }
        }
    } catch (e: IOException) {
        e.printStackTrace()
    }
}

??代碼第1??行~第3??行是通過 Java 標(biāo)準(zhǔn)輸入流從鍵盤讀取字符串,相當(dāng)于 Kotlin 中的 readLine() 函數(shù)重斑。這里創(chuàng)建了兩個(gè)輸入流代碼兵睛,見代碼第1??行和第2??行。一個(gè)讀取數(shù)據(jù)的函數(shù)見代碼第3??行窥浪,它們都會(huì)拋出 IOException 異常祖很。IOException 在 Java 中是受檢查異常,必須要進(jìn)行捕獲或拋出處理漾脂,而 Kotlin 中不用必須捕獲假颇。

調(diào)用 Java 函數(shù)式接口

??Java 函數(shù)式接口中 只有一個(gè)抽象函數(shù)接口,簡(jiǎn)稱 SAM (Single Abstract Method)骨稿,在 Kotlin 中調(diào)用 Java 函數(shù)式接口非常簡(jiǎn)單笨鸡,形式是 接口名{...}姜钳。

// Calculable.java
public interface Calculable {
    int calculateInt(int a, int b);
}
// main.kt
fun main(args: Array<String>?) {
    val n1 = 10
    val n2 = 5

    // 實(shí)現(xiàn)加法計(jì)算的Calculable對(duì)象
    val f1 = Calculable { a, b -> a + b }
    // 實(shí)現(xiàn)減法計(jì)算的Calculable對(duì)象
    val f2 = Calculable { a, b -> a - b }

    // 調(diào)用calculateInt函數(shù)進(jìn)行加法計(jì)算
    println("$n1 + $n2 = ${f1.calculateInt(n1, n2)}")
    // 調(diào)用calculateInt函數(shù)進(jìn)行減法計(jì)算
    println("$n1 - $n2 = ${f2.calculateInt(n1, n2)}")
}
// 運(yùn)行結(jié)果
10 + 5 = 15
10 - 5 = 5
Process finished with exit code 0
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市形耗,隨后出現(xiàn)的幾起案子哥桥,更是在濱河造成了極大的恐慌,老刑警劉巖激涤,帶你破解...
    沈念sama閱讀 206,482評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拟糕,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡昔期,警方通過查閱死者的電腦和手機(jī)已卸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來硼一,“玉大人累澡,你說我怎么就攤上這事“阍簦” “怎么了愧哟?”我有些...
    開封第一講書人閱讀 152,762評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)哼蛆。 經(jīng)常有香客問我蕊梧,道長(zhǎng),這世上最難降的妖魔是什么腮介? 我笑而不...
    開封第一講書人閱讀 55,273評(píng)論 1 279
  • 正文 為了忘掉前任肥矢,我火速辦了婚禮,結(jié)果婚禮上叠洗,老公的妹妹穿的比我還像新娘甘改。我一直安慰自己,他們只是感情好灭抑,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評(píng)論 5 373
  • 文/花漫 我一把揭開白布十艾。 她就那樣靜靜地躺著,像睡著了一般腾节。 火紅的嫁衣襯著肌膚如雪忘嫉。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,046評(píng)論 1 285
  • 那天案腺,我揣著相機(jī)與錄音庆冕,去河邊找鬼。 笑死劈榨,一個(gè)胖子當(dāng)著我的面吹牛愧杯,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播鞋既,決...
    沈念sama閱讀 38,351評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼力九,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了邑闺?” 一聲冷哼從身側(cè)響起跌前,我...
    開封第一講書人閱讀 36,988評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎陡舅,沒想到半個(gè)月后抵乓,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,476評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡靶衍,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評(píng)論 2 324
  • 正文 我和宋清朗相戀三年灾炭,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片颅眶。...
    茶點(diǎn)故事閱讀 38,064評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蜈出,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出涛酗,到底是詐尸還是另有隱情铡原,我是刑警寧澤,帶...
    沈念sama閱讀 33,712評(píng)論 4 323
  • 正文 年R本政府宣布商叹,位于F島的核電站燕刻,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏剖笙。R本人自食惡果不足惜卵洗,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望弥咪。 院中可真熱鬧过蹂,春花似錦、人聲如沸酪夷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)晚岭。三九已至鸥印,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間坦报,已是汗流浹背库说。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留片择,地道東北人潜的。 一個(gè)月前我還...
    沈念sama閱讀 45,511評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像字管,于是被迫代替她去往敵國(guó)和親啰挪。 傳聞我的和親對(duì)象是個(gè)殘疾皇子信不,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容