從Kotlin調用Java代碼

Kotlin代碼與Java代碼完全兼容。 Java代碼在Kotlin代碼中輕鬆調用,Kotlin代碼也可以通過Java代碼的正常方式調用。

從Kotlin調用Java代碼

從Kotlin文件調用Java void方法

從Kotlin調用返回類型爲void的java代碼時,它在Kotlin文件中返回Unit。 如果想要返回一個值,它將由Kotlin編譯器分配給Kotlin文件並返回Unit。 例如:

代碼文件:MyKotlinFile.kt

fun main(args: Array<String>) {
    val sum= MyJavaClass.add(5, 10)
    println("printing sum inside Kotlin file: "+sum)
}

代碼文件:MyJavaClass.java

public class MyJavaClass {
    public static void main(String[] args){

    }
    public static void add(int a,int b){
        int result = a + b;
        System.out.println("printing inside Java class :"+result);
    }
}

運行代碼:MyKotlinFile.kt ,得到以下結果 -

printing inside Java class :15
printing sum inside Kotlin file: kotlin.Unit

從Kotlin文件調用Java int方法

在從Kotlin文件調用int類型或其他(而不是void)的java代碼時,它返回相同類型的結果。 例如,從Kotlin文件調用Java類的area()方法會返回int類型的結果。

代碼文件:MyKotlinFile.kt

fun main(args: Array<String>) {
    val area: Int = MyJavaClass.area(3, 4)
    println("printing area from java insideKotlin file: "+area)
}

代碼文件:MyJavaClass.java

public class MyJavaClass {
    public static void main(String[] args){

    }
    public static int area(int a, int b){
        int result = a * b;
        return result;
    }
}

運行代碼:MyKotlinFile.kt ,得到以下結果 -

printing area from java insideKotlin file: 12

Kotlin調用包內的Java類

如果想要從Kotlin文件調用存在於不同包中的Java代碼,則需要在Kotlin文件中使用Java類導入包名。

例如,一個Java類MyJavaClass.java存在於一個包myjavapackage中,一個Kotlin文件MyKotlinFile.kt存在於mykotlinpackage包中。 在這種情況下,從Kotlin文件調用Java代碼需要在Kotlin文件中導入myjavapackage.MyJavaClass包。

代碼文件:MyKotlinFile.kt

package mykotlinpackage

import myjavapackage.MyJavaClass

fun main(args: Array<String>) {
    val area: Int = MyJavaClass.area(3, 6)
    println("printing area from java insideKotlin file: "+area)
}

代碼文件:MyJavaClass.java

package myjavapackage;

public class MyJavaClass {
    public static void main(String[] args){

    }
    public static int area(int a, int b){
        int result = a * b;
        return result;
    }
}

運行代碼:MyKotlinFile.kt ,得到以下結果 -

printing area from java insideKotlin file: 18

Kotlin代碼訪問Java getter和setter

由於Kotlin與Java完全互操作,在Kotlin可以訪問Java類(或POJO類)的gettersetter方法。例如,在Java類MyJava.java中創建一個gettersetter方法,用於設置和讀取firstNamelastName屬性。 從Kotlin文件通過使用MyJava.java類來創建對象,在MyKotlin.kt訪問這些屬性。

文件:MyJava.java -

public class MyJava{
    protected String firstName;
    protected String lastName;

    public String getfirstName() {
        return firstName;
    }
    public void setfirstName(String firstName) {
        this.firstName = firstName;
    }
    public String getlastName() {
        return lastName;
    }
    public void setlastName(String lastName) {
        this.lastName = lastName;
    }
}

文件:MyKotlin.kt -

fun main(args: Array<String>) {
    val myJava = MyJava()

    myJava.lastName = "Max"
    myJava.setfirstName("Su")

    println("使用屬性訪問值: "+myJava.firstName)
    println("使用屬性訪問值: "+myJava.lastName)
    println("------------------------------------")
    println("使用方法訪問值: "+myJava.getfirstName())
    println("使用方法訪問值: "+myJava.getlastName())
}

運行代碼:MyKotlin.kt ,得到以下結果 -

使用屬性訪問值: Su
使用屬性訪問值: Max
------------------------------------
使用方法訪問值: Su
使用方法訪問值: Max

Kotlin代碼訪問Java數組

可以簡單地調用Java類方法,該方法將數組作爲Kotlin文件中的參數。 例如,創建方法sumValue(),它將數組元素作爲Java類MyJava.java中的參數計算加法並返回結果。 通過將數組作爲參數傳遞,從Kotlin文件MyKotlin.kt調用此方法。

文件:MyJava.java -

public class MyJava {

    public int sumValues(int[] nums) {
        int result = 0;
        for (int x:nums) {
            result+=x;
        }
        return result;
    }
}

文件:MyKotlin.kt -

fun main(args: Array<String>){
    val myJava = MyJava()
    val numArray = intArrayOf(1, 2, 3,4,5)
    val sum = myJava.sumValues(numArray)
    println("數組元素總和:"+sum)
}

運行代碼:MyKotlin.kt ,得到以下結果 -

數組元素總和:15

Kotlin代碼訪問Java可變參數

在Java可變參數函數中,可以將任意數量的參數傳遞給方法。 Java可變參數使用省略號定義,即數據類型後的三個點(...)。

使用可變參數(varargs)時,應注意以下幾點:

  • 方法中只有一個可變參數(varargs)。
  • 可變參數(varargs)必須是最後一個參數。

在從Kotlin訪問Java可變參數(varargs)時,需要使用運算符*來傳遞數組。

下面來看看一個從Kotlin文件調用Java方法使用int類型可變參數(varargs)的示例。

public class MyJava {
    public void display(int... values) {
        for (int s : values) {
            System.out.println(s);
        }
    }
}

文件:MyKotlin.kt -

fun main(args: Array<String>){
    val myJava = MyJava()
    val array = intArrayOf(0, 1, 2, 3)
    myJava.display(*array)
}

運行代碼:MyKotlin.kt ,得到以下結果 -

0
1
2
3

讓我們來看另一個例子,它在Java方法中使用兩個參數作爲String類型的參數,並從Kotlin文件調用的int類型可變參數(varargs)。

文件:MyJava.java -

public class MyJava {
    public void display(String message,int... values) {
        System.out.println("string is " + message);
        for (int s : values) {
            System.out.println(s);
        }
    }
}

文件:MyKotlin.kt -

fun main(args: Array<String>){
    val myJava = MyJava()
    val array = intArrayOf(0, 1, 2, 3)
    myJava.display("hello",*array)
}

運行代碼:MyKotlin.kt ,得到以下結果 -

string is hello
0
1
2
3

Kotlin和Java映射類型

Kotlin和Java類型的映射方式不同,但它們都能映射到相應的類型。 這些類型的映射僅在編譯時纔有意義,運行時保持不變。

Java的原始類型對應的Kotlin類型

Java類型

Kotlin類型

byte

kotlin.Byte

short

kotlin.Short

int

kotlin.Int

long

kotlin.Long

char

kotlin.Char

double

kotlin.Double

boolean

kotlin.Boolean

Java非原始類型對應的Kotlin類型

Java類型

Kotlin類型

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類型

Kotlin類型

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類型

Java類型

Kotlin只讀類型

Kotlin可變類型

Iterator<T>

Iterator<T>

MutableIterator<T>

Iterable<T>

Iterable<T>

MutableIterable<T>

Collection<T>

Collection<T>

MutableCollection<T>

Set<T>

MutableSet<T>

MutableSet<T>

List<T>

MutableList<T>

MutableList<T>

ListIterator<T>

ListIterator<T>

MutableListIterator<T>

Map<K, V>

Map<K, V>

MutableMap<K, V>

Map.Entry<K, V>

Map.Entry<K, V>

MutableMap.MutableEntry<K, V>