Kotlin與Java互操做

1,Kotlin 調用Javacss

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的默認調用html

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

若是一個java函數是void類型的,那麼kotlin調用後得到的返回值類型是Unitgit

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

foo.`is`(bar)

2,null安全和平臺類型
web

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 // 編譯經過,但運行時可能報錯

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

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

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

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


3,類型對應關係

Java type Kotlin type
byte kotlin.Byte
short kotlin.Short
int kotlin.Int
long kotlin.Long
char kotlin.Char
float kotlin.Float
double kotlin.Double
boolean kotlin.Boolean

 


Java type Kotlin type
java.lang.Object kotlin.Any!
java.lang.Cloneable kotlin.Cloneable!
java.lang.Comparable kotlin.Comparable!
java.lang.Enum kotlin.Enum!
java.lang.Annotation kotlin.Annotation!
java.lang.Deprecated kotlin.Deprecated!
java.lang.CharSequence kotlin.CharSequence!
java.lang.String kotlin.String!
java.lang.Number kotlin.Number!
java.lang.Throwable kotlin.Throwable!

 

Edit Page


Java type Kotlin type
java.lang.Byte kotlin.Byte?
java.lang.Short kotlin.Short?
java.lang.Integer kotlin.Int?
java.lang.Long kotlin.Long?
java.lang.Character kotlin.Char?
java.lang.Float kotlin.Float?
java.lang.Double kotlin.Double?
java.lang.Boolean kotlin.Boolean?

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

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

Java type Kotlin read-only type Kotlin mutable type Loaded 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 type Kotlin 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

相關文章
相關標籤/搜索