Java 互操作性

2024 年 8 月 29 日 | 5 分钟阅读

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

从 Kotlin 调用 Java 代码

从 Kotlin 文件调用 Java void 方法

当从 Kotlin 调用 Java 代码,且其返回类型为 void 时,它将在 Kotlin 文件中返回 Unit。如果有人想要返回值,它将被 Kotlin 编译器赋值给 Kotlin 文件并返回 Unit。 例如

MyKotlinFile.kt

MyJavaClass.java

输出

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

从 Kotlin 文件调用 Java int 方法

当从 Kotlin 文件调用 Java 代码的 int 类型或其他类型(而不是 void)时,它将返回相同类型的结果。 例如,从 Kotlin 文件调用 Java 类的 area() 方法将返回 int 类型的结果。

MyKotlinFile.kt

MyJavaClass.java

输出

printing area from java insideKotlinfile: 12

Kotlin 代码调用位于包中的 Java 类

如果我们想从 Kotlin 文件中调用 Java 代码,并且两者都位于不同的包中,则需要在 Kotlin 文件中导入包含 Java 类的包名。

例如,一个 Java 类MyJavaClass.java 位于包 myjavapackageand 中,一个 Kotlin 文件 MyKotlinFile.kt 位于 mykotlinpackage 包中。 在这种情况下,从 Kotlin 文件调用 Java 代码需要在 Kotlin 文件中导入myjavapackage.MyJavaClass

MyKotlinFile.kt

MyJavaClass.java

输出

printing area from java inside Kotlin file: 12

Kotlin 代码访问 Java getter 和 setter

由于 Kotlin 与 Java 完全互操作,我们可以访问 Java 类(或 POJO 类)的 gettersetter 功能。 例如,在 Java 类 MyJava.java 中创建具有属性 firstNamelastName 的 getter 和 setter 方法。 通过在 Kotlin 文件中创建 MyJava.java 的对象,可以从 Kotlin 文件 MyKotlin.kt 访问这些属性。

MyJava.java

MyKotlin.kt

输出

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

Kotlin 代码访问 Java 数组

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

MyJava.java

MyKotlin.kt

输出

sum of array element is 15

Kotlin 代码访问 Java Varargs

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

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

  • 一个方法中只有一个 varargs 参数。
  • Varargs 参数必须是最后一个参数。

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

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

MyJava.java

MyKotlin.kt

输出

0
1
2
3

让我们看另一个例子,该示例在 Java 方法中使用两个参数,分别作为 String 类型和 int 类型 varargs 的参数,并从 Kotlin 文件调用。

MyJava.java

MyKotlin.kt

输出

string is hello
0
1
2
3

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 的 boxed 原始类型与相应的可空 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>