kotlin汇总9-在kotlin中调用java

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