Kotlin教程:调用Java代码

2020年4月24日10:32:16 发表评论 235 views

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)
}
Kotlin

代码文件: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);
    }
}
Java

运行代码:MyKotlinFile.kt ,得到以下结果 -

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

从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)
}
Kotlin

代码文件: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;
    }
}
Java

运行代码:MyKotlinFile.kt ,得到以下结果 -

printing area from java insideKotlin file: 12
Shell

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)
}
Kotlin

代码文件: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;
    }
}
Java

运行代码:MyKotlinFile.kt ,得到以下结果 -

printing area from java insideKotlin file: 18
Shell

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;
    }
}
Java

文件: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())
}
Kotlin

运行代码:MyKotlin.kt ,得到以下结果 -

使用属性访问值: Su
使用属性访问值: Max
------------------------------------
使用方法访问值: Su
使用方法访问值: Max
Shell

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;
    }
}
Java

文件: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)
}
Kotlin

运行代码:MyKotlin.kt ,得到以下结果 -

数组元素总和:15
Shell

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);
        }
    }
}
Java

文件:MyKotlin.kt -

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

运行代码:MyKotlin.kt ,得到以下结果 -

0
1
2
3
Shell

让我们来看另一个例子,它在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);
        }
    }
}
Java

文件:MyKotlin.kt -

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

运行代码:MyKotlin.kt ,得到以下结果 -

string is hello
0
1
2
3
Shell

Kotlin和Java映射类型

Kotlin和Java类型的映射方式不同,但它们都能映射到相应的类型。 这些类型的映射仅在编译时才有意义,运行时保持不变。

Java的原始类型对应的Kotlin类型

Java类型Kotlin类型
bytekotlin.Byte
shortkotlin.Short
intkotlin.Int
longkotlin.Long
charkotlin.Char
doublekotlin.Double
booleankotlin.Boolean

Java非原始类型对应的Kotlin类型

Java类型Kotlin类型
java.lang.Objectkotlin.Any!
java.lang.Cloneablekotlin.Cloneable!
java.lang.Comparablekotlin.Comparable!
java.lang.Enumkotlin.Enum!
java.lang.Annotationkotlin.Annotation!
java.lang.Deprecatedkotlin.Deprecated!
java.lang.CharSequencekotlin.CharSequence!
java.lang.Stringkotlin.String!
java.lang.Numberkotlin.Number!
java.lang.Throwablekotlin.Throwable!

Java盒装原始类型和相应的可空Kotlin类型

Java类型Kotlin类型
java.lang.Bytekotlin.Byte?
java.lang.Shortkotlin.Short?
java.lang.Integerkotlin.Int?
java.lang.Longkotlin.Long?
java.lang.Characterkotlin.Char?
java.lang.Floatkotlin.Float?
java.lang.Doublekotlin.Double?
java.lang.Booleankotlin.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>

//原文出自【易百教程】,商业转载请联系作者获得授权,非商业转载请保留原文链接:https://www.yiibai.com/kotlin/kotlin-java-interoperability-calling-java-from-kotlin.html#article-start

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: