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) {
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) {
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) {
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
类)的getter
和setter
方法。例如,在Java类MyJava.java
中创建一个getter
和setter
方法,用于设置和读取firstName
和lastName
属性。 从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) {
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){
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){
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){
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类型 |
---|---|
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 | 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 |
//原文出自【易百教程】,商业转载请联系作者获得授权,非商业转载请保留原文链接:https://www.yiibai.com/kotlin/kotlin-java-interoperability-calling-java-from-kotlin.html#article-start