從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>