Kotlin代码与Java代码完全兼容。 Java代码在Kotlin代码中轻松调用,Kotlin代码也可以通过Java代码的正常方式调用。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18324.html
从Kotlin调用Java代码
从Kotlin文件调用Java void方法
从Kotlin调用返回类型为void
的java代码时,它在Kotlin
文件中返回Unit
。 如果想要返回一个值,它将由Kotlin编译器分配给Kotlin文件并返回Unit
。 例如:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18324.html
代码文件:MyKotlinFile.kt文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18324.html
fun main(args: Array<String>) {
val sum= MyJavaClass.add(5, 10)
println("printing sum inside Kotlin file: "+sum)
}
代码文件:MyJavaClass.java文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18324.html
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 ,得到以下结果 -文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18324.html
printing inside Java class :15
printing sum inside Kotlin file: kotlin.Unit
从Kotlin文件调用Java int方法
在从Kotlin文件调用int
类型或其他(而不是void
)的java代码时,它返回相同类型的结果。 例如,从Kotlin文件调用Java类的area()
方法会返回int
类型的结果。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18324.html
代码文件:MyKotlinFile.kt文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18324.html
fun main(args: Array<String>) {
val area: Int = MyJavaClass.area(3, 4)
println("printing area from java insideKotlin file: "+area)
}
代码文件:MyJavaClass.java文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18324.html
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 ,得到以下结果 -文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18324.html
printing area from java insideKotlin file: 12
Kotlin调用包内的Java类
如果想要从Kotlin文件调用存在于不同包中的Java代码,则需要在Kotlin文件中使用Java类导入包名。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18324.html
例如,一个Java类MyJavaClass.java
存在于一个包myjavapackage
中,一个Kotlin文件MyKotlinFile.kt
存在于mykotlinpackage
包中。 在这种情况下,从Kotlin文件调用Java代码需要在Kotlin文件中导入myjavapackage.MyJavaClass
包。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18324.html
代码文件:MyKotlinFile.kt文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18324.html
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文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18324.html
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 ,得到以下结果 -文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18324.html
printing area from java insideKotlin file: 18
Kotlin代码访问Java getter和setter
由于Kotlin与Java完全互操作,在Kotlin可以访问Java类(或POJO
类)的getter
和setter
方法。例如,在Java类MyJava.java
中创建一个getter
和setter
方法,用于设置和读取firstName
和lastName
属性。 从Kotlin文件通过使用MyJava.java
类来创建对象,在MyKotlin.kt
访问这些属性。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18324.html
文件:MyJava.java -文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18324.html
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 -文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18324.html
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 ,得到以下结果 -文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18324.html
使用属性访问值: Su
使用属性访问值: Max
------------------------------------
使用方法访问值: Su
使用方法访问值: Max
Kotlin代码访问Java数组
可以简单地调用Java类方法,该方法将数组作为Kotlin文件中的参数。 例如,创建方法sumValue()
,它将数组元素作为Java类MyJava.java
中的参数计算加法并返回结果。 通过将数组作为参数传递,从Kotlin文件MyKotlin.kt
调用此方法。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18324.html
文件:MyJava.java -文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18324.html
public class MyJava {
public int sumValues(int[] nums) {
int result = 0;
for (int x:nums) {
result+=x;
}
return result;
}
}
文件:MyKotlin.kt -文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18324.html
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 ,得到以下结果 -文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18324.html
数组元素总和:15
Kotlin代码访问Java可变参数
在Java可变参数函数中,可以将任意数量的参数传递给方法。 Java可变参数使用省略号定义,即数据类型后的三个点(...
)。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18324.html
使用可变参数(varargs)时,应注意以下几点:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18324.html
- 方法中只有一个可变参数(varargs)。
- 可变参数(varargs)必须是最后一个参数。
在从Kotlin访问Java可变参数(varargs)时,需要使用运算符*
来传递数组。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18324.html
下面来看看一个从Kotlin文件调用Java方法使用int
类型可变参数(varargs)的示例。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18324.html
public class MyJava {
public void display(int... values) {
for (int s : values) {
System.out.println(s);
}
}
}
文件:MyKotlin.kt -文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18324.html
fun main(args: Array<String>){
val myJava = MyJava()
val array = intArrayOf(0, 1, 2, 3)
myJava.display(*array)
}
运行代码:MyKotlin.kt ,得到以下结果 -文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18324.html
0
1
2
3
让我们来看另一个例子,它在Java方法中使用两个参数作为String
类型的参数,并从Kotlin文件调用的int
类型可变参数(varargs)。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18324.html
文件:MyJava.java -文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18324.html
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 -文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18324.html
fun main(args: Array<String>){
val myJava = MyJava()
val array = intArrayOf(0, 1, 2, 3)
myJava.display("hello",*array)
}
运行代码:MyKotlin.kt ,得到以下结果 -文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18324.html
string is hello
0
1
2
3
Kotlin和Java映射类型
Kotlin和Java类型的映射方式不同,但它们都能映射到相应的类型。 这些类型的映射仅在编译时才有意义,运行时保持不变。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18324.html
Java的原始类型对应的Kotlin类型文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18324.html
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类型文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18324.html
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类型文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18324.html
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类型文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18324.html
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.cainiaoxueyuan.com/ymba/18324.html
//原文出自【易百教程】,商业转载请联系作者获得授权,非商业转载请保留原文链接:https://www.yiibai.com/kotlin/kotlin-java-interoperability-calling-java-from-kotlin.html#article-start文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18324.html