android kotlin詳解(2)

這篇博客,我思來想去講kotlin什麼呢?然後想想,還是先從簡單的入手,就講java 調用kotlin時,設計到的一些註釋。

(1)@JvmField:如果需要在 Java 中將 Kotlin 的屬性作爲字段暴露,那就需要使用 @JvmField 註解對其標註。例如:

class User {
    var age: Int;
    var sex: String;

    constructor(name: String, age: Int, sex: String) {
        this.sex = sex;
        this.age = age;
    }
}

那,在java類中,怎麼獲取 age 成員變量的值呢?

 User user=new User("jimTrency",28,"男");
 user.getAge()

如果:你想直接調用呢?如:user.age

解決方法,在對應的kotlin類對應的字段添加對應的註釋就行了。

@JvmField var age: Int;

ps: lateinit 修飾符 和 const 修飾符。也可將 Kotlin的屬性作爲字段暴露出來。

(2)@JvmStatic

class User {
    var age: Int;
    var sex: String;

    constructor(name: String, age: Int, sex: String) {
        this.sex = sex;
        this.age = age;
    }

     companion object {
        fun foo(): String {
            return "haha";
        }
    }

}

在java類中,怎麼調用foo()函數呢?如下:

 User user=new User("jimTrency",28,"男");
 user.Companion.foo();
 //User .Companion.foo();//這樣調用也行

那,我想這麼調用呢?User .foo();該怎麼做,不說你們肯定也知道了。

companion object {
   @JvmStatic fun foo(): String {
        return "haha";
    }
}

ps:這個註釋 @JvmStatic, 在Kotlin類中, 只可以爲命名對象或伴生對象中定義的函數生成靜態方法。

(3)@JvmName :解決簽名衝突

fun List<String>.filterValid(){}

@JvmName("filterValidInt")
fun List<Int>.filterValid(){}

(4)@JvmOverloads : 使Java 調用該函數時暴露多個重載

@JvmOverloads fun f(a: String, b: Int = 0, c: String = "jimTrency") {

}   

在java類調用時,呈現的狀態:

// Java
void f(String a, int b, String c) { }
void f(String a, int b) { }
void f(String a) { }

(5)@Throws :Kotlin 沒有受檢異常。 所以,通常 Kotlin 函數的 Java 簽名不會聲明拋出異常。 於是如果我們有一個這樣的 Kotlin 函數:

fun testThrow(){
    throw Exception()
}

在java類中調用:(user:爲User類的對象,裏面有testThrow()函數)

try {
        user.testThrow();

    }catch (Exception e){

    // 錯誤:testThrow() 未在 throws 列表中聲明 Exception
        e.printStackTrace();
    }

那怎麼解決這個問題呢?sb,就知道添加對應的註釋,就ok了。

@Throws
fun testThrow(){
    throw Exception()
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章