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