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的關鍵字,好比: in, object, is ,那麼在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! |
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