Kotlin與Java互操作

1,Kotlin 調用Java

import java.util.*

fun demo(source: List<Int>) {
    val list = ArrayList<Int>()    
    for (item in source) {
        list.add(item)
    }
    for (i in 0..source.size - 1) {
        list[i] = source[i] // get and set are called
    }
}

關於getter和setter的默認調用

import java.util.Calendar

fun calendarDemo() {
    val calendar = Calendar.getInstance()
    if (calendar.firstDayOfWeek == Calendar.SUNDAY) {  // 調用了getFirstDayOfWeek()
        calendar.firstDayOfWeek = Calendar.MONDAY      // 調用了 setFirstDayOfWeek()
    }
    if (!calendar.isLenient) {                         // 調用了isLenient()
        calendar.isLenient = true                      // 調用了setLenient()
    }
}

注意,如果一個java屬性只有setter,那麼Kotlin就無法訪問。 Kotlin訪問java的屬性其實是默認調用了這個屬性的getter函數

如果一個java函數是void類型的,那麼kotlin調用後獲得的返回值類型是Unit

如果一個java函數名用了kotlin的關鍵字,比如inobjectis ,那麼在kotlin中訪問的時候,要給函數名加上' ,

foo.`is`(bar)

2,null安全和平臺類型

java中的對象很可能是null,kotlin把java對象當做平臺類型,對其null安全要求不再那麼苛刻

val list = ArrayList<String>() // 不需要java的new了
list.add("Item")
val size = list.size 
val item = list[0] // 普通java對象,當做平臺類型
//當我們調用平臺類型的變量時, Kotlin不會在編譯階段就做null安全性檢查, 但運行的時候可能會訪問失敗
item.substring(1) // 編譯通過,運行的時候如果item是null就會拋出exception 
val nullable: String? = item // 正確
val notNull: String = item // 編譯通過,但運行時可能報錯

我們不能在代碼中顯式聲明平臺類型,爲了方便編譯階段檢查,我們設定以下記憶符號:

  • T! 意思是 "T 或T?",

  • (Mutable)Collection<T>! 意思是 "Java collection of T may be mutable or not, may be nullable or not",

  • Array<(out) T>! 意思是"Java array of T (or a subtype of T), nullable or not"


3,類型對應關係

Java typeKotlin type
bytekotlin.Byte
shortkotlin.Short
intkotlin.Int
longkotlin.Long
charkotlin.Char
floatkotlin.Float
doublekotlin.Double
booleankotlin.Boolean

 


Java typeKotlin type
java.lang.Objectkotlin.Any!
java.lang.Cloneablekotlin.Cloneable!
java.lang.Comparablekotlin.Comparable!
java.lang.Enumkotlin.Enum!
java.lang.Annotationkotlin.Annotation!
java.lang.Deprecatedkotlin.Deprecated!
java.lang.CharSequencekotlin.CharSequence!
java.lang.Stringkotlin.String!
java.lang.Numberkotlin.Number!
java.lang.Throwablekotlin.Throwable!

 

Edit Page


Java typeKotlin type
java.lang.Bytekotlin.Byte?
java.lang.Shortkotlin.Short?
java.lang.Integerkotlin.Int?
java.lang.Longkotlin.Long?
java.lang.Characterkotlin.Char?
java.lang.Floatkotlin.Float?
java.lang.Doublekotlin.Double?
java.lang.Booleankotlin.Boolean?

注意,如果java用了原始類型作爲參數,那麼在kotlin中轉換爲平臺類型,比如:List<java.lang.Integer> 在kotlin中對應 List<Int!> 

Kotlin的集合類型可以是隻讀的,或者可變的,所以,跟java的集合類型對應關係如下  (下表裏面的這些Kotlin 類型都在包 kotlin.collections裏):

Java typeKotlin read-only typeKotlin mutable typeLoaded platform type
Iterator<T>Iterator<T>MutableIterator<T>(Mutable)Iterator<T>!
Iterable<T>Iterable<T>MutableIterable<T>(Mutable)Iterable<T>!
Collection<T>Collection<T>MutableCollection<T>(Mutable)Collection<T>!
Set<T>Set<T>MutableSet<T>(Mutable)Set<T>!
List<T>List<T>MutableList<T>(Mutable)List<T>!
ListIterator<T>ListIterator<T>MutableListIterator<T>(Mutable)ListIterator<T>!
Map<K, V>Map<K, V>MutableMap<K, V>(Mutable)Map<K, V>!
Map.Entry<K, V>Map.Entry<K, V>MutableMap.MutableEntry<K,V>(Mutable)Map.(Mutable)Entry<K, V>!

Java'的對應如下:

Java typeKotlin type
int[]kotlin.IntArray!
String[]kotlin.Array<(out) String>!

注意: java的static 變量不能作爲kotlin companion 對象直接訪問,必須要帶上java類型纔可以,比如 java.lang.Integer.toHexString(foo).

參考文獻:https://kotlinlang.org/docs/reference/java-interop.html




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章