Kotlin代码与Java代码完全兼容。 Java代码在Kotlin代码中轻松调用,Kotlin代码也可以通过Java代码的正常方式调用。
从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文件调用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类导入包名。
例如,一个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完全互操作,在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; } }
文件: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
可以简单地调用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
在Java可变参数函数中,可以将任意数量的参数传递给方法。 Java可变参数使用省略号定义,即数据类型后的三个点(...
)。
使用可变参数(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类型的映射方式不同,但它们都能映射到相应的类型。 这些类型的映射仅在编译时才有意义,运行时保持不变。
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> |