Kotlin-44.Java調用kotlin之二(Call Kotlin from Java)

官方文檔: http://kotlinlang.org/docs/reference/java-to-kotlin-interop.html

4.靜態字段(Static Fields)

在對象(object)或伴生對象(companion object)中聲明的Kotlin屬性,有靜態的幕後字段(backing fields)!
這些靜態字段是私有private,但可通過以下方式暴露(公開public):
    @JvmField 註解
    lateinit 修飾符
    const 修飾符

1.用@JvmField註解屬性,使對應的java靜態字段與kotlin屬性可見性相同(默認public)
    // kotlin
    class Key(val value: Int) {
        companion object {
            @JvmField
            val COMPARATOR: Comparator<Key> = compareBy<Key> { it.value }
        }
    }

    // Java
    Key.COMPARATOR; // COMPARATOR字段是 public static final

2.用lateinit修飾屬性,使對應的靜態字段與屬性訪問器setter可見性相同(默認public)
    // kotlin
    object Singleton {            
        lateinit var provider: Provider // lateinit 延遲初始化
    }

    // Java
    Singleton.provider = new Provider(); // provider字段是 public static 非final

3.用const修飾的(在類中以及在頂層)屬性,在Java中會成爲public靜態字段
    // kotlin代碼(example.kt文件)
    object Obj {
        const val CONST = 1
    }
    class C {
        companion object {
            const val VERSION = 9
        }
    }
    const val MAX = 239

    // Java代碼
    int c = Obj.CONST;
    int v = C.VERSION;
    int d = ExampleKt.MAX;

5.靜態方法(Static Methods)

如果在對象(object)或伴生對象(companion object)中的函數被@JvmStatic註解,
那麼編譯器既會在該對象的類中生成靜態方法,也會在對象自身中生成實例方法!
此外,@JvmStatic註解也可用於對象或伴生對象的屬性,使其getter和setter方法是靜態成員!
示例1:
    // kotlin
    class C {
        companion object {
            @JvmStatic fun foo() {}
            fun bar() {}
        }
    }

    // Java
    C.foo(); // OK,靜態方法
    C.bar(); // 錯誤,不是靜態方法
    C.Companion.foo(); // OK,實例方法
    C.Companion.bar(); // OK,實例方法

示例2:
    // kotlin     
    object Obj {
        @JvmStatic fun foo() {}
        fun bar() {}
    }

    // Java
    Obj.foo(); // OK,靜態方法
    Obj.bar(); // 錯誤,不是靜態方法
    Obj.INSTANCE.bar(); // OK,單例方法
    Obj.INSTANCE.foo(); // OK,單例方法

6.可見性(Visibility)

Kotlin可見性與Java的映射關係:
    private成員編譯成Java的private成員;
    private頂層聲明編譯成Java的包級局部聲明(package-local);
    protected編譯成Java的protected(Java允許訪問同包中其它類的protected成員,所以Java類會訪問權限更廣);
    internal聲明編譯成Java的public;
    public編譯成Java的public;

7.KClass

有時在java中調用Kotlin函數(有KClass類型參數),但無法把Java的Class自動轉換成kotlin的KClass,
所以必須通過調用Class<T>.kotlin擴展屬性來手動轉換:
    kotlin.jvm.JvmClassMappingKt.getKotlinClass(MainView.class)

簡書:http://www.jianshu.com/p/042ea2c9062c
CSDN博客: http://blog.csdn.net/qq_32115439/article/details/75332128
GitHub博客:http://lioil.win/2017/07/18/Kotlin-kotlinInJava2.html
Coding博客:http://c.lioil.win/2017/07/18/Kotlin-kotlinInJava2.html

發佈了156 篇原創文章 · 獲贊 38 · 訪問量 27萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章