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