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

上一篇: Kotlin實用函數 下一篇: 從Java調用Kotlin代碼