📜  Kotlin Java互操作性从Kotlin调用Java

📅  最后修改于: 2021-01-05 08:10:01             🧑  作者: Mango

Java互操作性

Kotlin代码与Java代码完全兼容。现有的Java代码可以很容易地从Kotlin代码中调用,并且Kotlin代码也可以以普通方式从Java代码中调用。

从Kotlin调用Java代码

调用Java void方法表单Kotlin文件

从Kotlin调用其返回类型为void的Java代码时,它将在Kotlin文件中返回Unit。如果有人想返回该值,它将由Kotlin编译器分配给Kotlin文件并返回Unit。例如:

MyKotlinFile.kt

fun main(args: Array) {
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(inta,int b){
int result = a + b;
System.out.println("printing inside Java class :"+result);
    }
}

输出:

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) {
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 l, int b){
int result = l * b;
        return result;
    }
}

输出:

printing area from java insideKotlinfile: 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) {
val area: Int = MyJavaClass.area(3, 4)
println("printing area from java inside Kotlin file: "+area)
}

MyJavaClass.java

package myjavapackage;

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

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

输出:

printing area from java inside Kotlin file: 12

Kotlin代码访问Java getter和setter

由于Kotlin与Java具有完全的互操作性,因此我们可以访问Java类(或POJO类)的gettersetter功能。例如,在Java类MyJava.java中使用属性firstNamelastName创建一个getter和setter方法。这些属性是从由在科特林文件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) {
val myJava = MyJava()

myJava.lastName = "Kumar"
myJava.setfirstName("Arjun")

println("accessing value using property: "+myJava.firstName)
println("accessing value using property: "+myJava.lastName)

println("accessing value using method: "+myJava.getfirstName())
println("accessing value using method: "+myJava.getlastName())
}

输出:

accessing value using property: Arjun
accessing value using property: Kumar
accessing value using method: Arjun
accessing value using method: Kumar

Kotlin代码访问Java数组

我们可以简单地调用Java类方法,该方法将数组作为Kotlin文件的参数。例如,创建方法sumValue(),该方法将数组元素作为Java类MyJava.java中的参数来计算加法并返回结果。通过将数组作为参数从Kotlin文件MyKotlin.kt中调用此方法。

MyJava.java

public class MyJava {

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

MyKotlin.kt

fun main(args: Array){
val myJava = MyJava()
val numArray = intArrayOf(1, 2, 3,4,5)
val sum = myJava.sumValues(numArray)
println(sum)
}

输出:

sum of array element is 15

Kotlin代码访问Java Varargs

在Java varags功能中,我们可以将任意数量的参数传递给方法。 Java varargs参数使用省略号定义,即数据类型后的三个点(…)。

使用varargs参数时,请注意以下几点:

  • 一个方法中只有一个varargs参数。
  • Varargsagrument必须位于最后一个参数。

从Kotlin访问Java varargs时,我们需要使用传播运算符*传递数组。

让我们来看一个示例,其中Java方法使用int类型varargs,该类型从Kotlin文件中调用。

MyJava.java

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

MyKotlin.kt

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

输出:

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){
val myJava = MyJava()
val array = intArrayOf(0, 1, 2, 3)
myJava.display("hello",*array)
}

输出:

string is hello
0
1
2
3

Kotlin和Java映射类型

Kotlin和Java类型的映射方式不同,但是它们映射至相应的类型。这些类型的映射仅在编译时才重要,并且运行时保持不变。

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

Java type Kotlin type
byte kotlin.Byte
short kotlin.Short
int kotlin.Int
long kotlin.Long
char kotlin.Char
double kotlin.Double
boolean kotlin.Boolean

Java的非基本类型与对应的Kotlin类型

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的盒装基本类型与对应的nullableKotlin类型

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?

Java的集合类型为对应的只读或可变Kotlin类型

Java type Kotlin read-only type Kotlin mutable type
Iterator Iterator MutableIterator
Iterable Iterable MutableIterable
Collection Collection MutableCollection
Set MutableSet MutableSet
List MutableList MutableList
ListIterator ListIterator MutableListIterator
Map Map MutableMap
Map.Entry Map.Entry MutableMap.MutableEntry