Kotlin-41.kotlin調用Java之三(Call Java from Kotlin)

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

繼續上一章

8.Java數組(Java Arrays)

與Java數組不同,Kotlin數組是不型變的,
意味着Kotlin不允許把Array<String>賦值給Array<Any>,從而避免了運行時出錯!
Kotlin也禁止把子類數組作爲超類/父類數組傳給Kotlin函數/方法,
但是對於Java方法是允許的(通過Array<(out) String>!平臺類型)!

在Java平臺上,數組會用原生/基本類型以避免裝箱/拆箱操作開銷,但是Kotlin隱藏了這些實現細節,
因此需要變通方法來與Java代碼交互,每種原生/基本類型數組都有對應的kotlin類(IntArray,DoubleArray,CharArray等)!
這些類與Array類無關,並且會編譯成Java原生/基本類型數組以獲得最佳性能!

示例:
    //Java代碼
    public class JavaArrayExample {
        public void removeIndices(int[] indices) {
            //...
        }
    }

    //Kotlin代碼
    val javaObj = JavaArrayExample()
    val array = intArrayOf(0, 1, 2, 3)
    javaObj.removeIndices(array)  //將int[]傳給java方法

1.kotlin編譯成JVM字節碼,編譯器會優化對數組的訪問,不會引入任何額外開銷:
    val array = arrayOf(1, 2, 3, 4)
    array[x] = array[x] * 2 // 實際上不會生成和調用array.get()和set()
    for (x in array) { // 不會創建迭代器iterator
        print(x)
    }

2.即使用索引遍歷定位,也不會引入任何額外開銷:
    for (i in array.indices) {// 不會創建迭代器iterator 
        print(array[i])
    }

3.in檢測也沒有額外開銷:
    if (i in array.indices) { // 等價於(i >= 0 && i < array.size)
        print(array[i])
    }

9.Java參數個數可變(Java Varargs)

Java類有時聲明參數個數可變(varargs)的方法來使用索引:
    //java代碼
    public class JavaArrayExample {
        public void removeIndices(int... indices) {
            //...
        }
    }

    //kotlin代碼,用展開運算符*傳遞IntArray到java方法:
    val javaObj = JavaArrayExample()
    val array = intArrayOf(0, 1, 2, 3)
    javaObj.removeIndicesVarArg(*array)

提示: 目前無法傳遞null給參數個數可變的方法!

簡書:http://www.jianshu.com/p/bc19337f0ff1
CSDN博客: http://blog.csdn.net/qq_32115439/article/details/75138487
GitHub博客:http://lioil.win/2017/07/14/Kotlin-javaInKotlin3.html
Coding博客:http://c.lioil.win/2017/07/14/Kotlin-javaInKotlin3.html

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