1.在kotlin中調用Java
下面的幾乎全java代碼都可以直接在kotlin使用
import java.util.*
fun demo(source: List<Int>) {
val list = ArrayList<Int>()
// 'for'-loops work for Java collections:
for (item in source) {
list.add(item)
}
// Operator conventions work as well:
for (i in 0..source.size() - 1) {
list[i] = source[i] // get and set are called
}
}
1.1 Getters和Setters
Java中set/get開頭的無參方式,在kotlin中可以直接當做屬性使用,比如下面代碼
import java.util.Calendar
fun calendarDemo() {
val calendar = Calendar.getInstance()
if (calendar.firstDayOfWeek == Calendar.SUNDAY) { // call getFirstDayOfWeek()
calendar.firstDayOfWeek = Calendar.MONDAY // call setFirstDayOfWeek()
}
}
另外需要注意,如果只有setter,那麼在kotlin將會不可見,因爲kotlin不支持set-only的屬性。
1.2 方法返回void
Java中的void等於kotlin中的Unit
1.3 反義kotlin中的關鍵字
比如in, object, is 是kotlin中的關鍵字,
比如java代碼
class Foo {
boolean isBar(){
retrurn true;
}
}
在kotlin中調用這個方法,需要反義is,如下:
foo.`is`(bar) // 通過``包圍可能是kotlin關鍵字
1.4 null安全和平臺類型
因爲所有Java的引用都可能是Null,所以所有來自Java的對象,你都需要像在Java中一樣確保對象不爲空
val list = ArrayList<String>() // non-null (constructor result)
list.add("Item")
val size = list.size() // non-null (primitive int)
val item = list[0] // platform type inferred (ordinary Java object)
val nullable: String? = item // allowed, always works
val notNull: String = item // allowed, may fail at runtime ,因爲item有可能是null,但是notNull是不能爲空,所以運行時會報錯
1.5 類型映射
原始類型對應關係
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封裝原始類型對應kotlin的可空類型
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? |
注意
List<java.lang.Integer>對應kotlin的List<Int!>
collections對應關係
Java type | Kotlin read-only type | Kotlin mutable type | Loaded platform type |
---|---|---|---|
Iterator | Iterator | MutableIterator | (Mutable)Iterator! |
Iterable | Iterable | MutableIterable | (Mutable)Iterable! |
Collection | Collection | MutableCollection | (Mutable)Collection! |
Set | Set | MutableSet | (Mutable)Set! |
List | List | MutableList | (Mutable)List! |
ListIterator | ListIterator | MutableListIterator | (Mutable)ListIterator! |
Map | Map | MutableMap | (Mutable)Map! |
Map.Entry | Map.Entry | MutableMap.MutableEntry | (Mutable)Map.(Mutable)Entry! |
Java數組對應關係
Java type | Kotlin type |
---|---|
int[] | kotlin.IntArray! |
String[] | kotlin.Array<(out) String>! |
Java泛型對應
Java的?通配符
Foo<? extends Bar> becomes Foo<out Bar!>!
Foo<? super Bar> becomes Foo<in Bar!>!
Java未加工類型
List becomes List<*>!, i.e. List<out Any?>!
kotlin僅僅允許*通配符使用is,例如
if (a is List<Int>) // Error: cannot check if it is really a List of Ints
// but
if (a is List<*>) // OK: no guarantees about the contents of the list
Java的不定參數
public class JavaArrayExample {
public void removeIndices(int... indices) {
// code here...
}
}
在kotlin調用,使用*來傳遞
val javaObj = JavaArray()
val array = intArrayOf(0, 1, 2, 3)
javaObj.removeIndicesVarArg(*array)
在kotlin中使用JNI,使用external修飾符
external fun foo(x: Int): Double