Kotlin 中调用 Java 代码
import java.util.*
fun demo(source: List<Int>) {
val list = ArrayList<Int>()
// “for”-循环用于 Java 集合:
for (item in source) {
list.add(item)
}
// 操作符约定同样有效:
for (i in 0..source.size() - 1) {
list[i] = source[i] // 调用 get 和 set
}
}
Java 中调用 Kotlin
// example.kt
package demo
class Foo
fun bar() {
}
// Java
new demo.Foo();
demo.ExampleKt.bar();
静态方法
class C {
companion object {
@JvmStatic fun foo() {}
fun bar() {}
}
}
//现在,foo() 在 Java 中是静态的,而 bar() 不是:
C.foo(); // 没问题
C.bar(); // 错误:不是一个静态方法
C.Companion.foo(); // 保留实例方法
C.Companion.bar(); // 唯一的工作方式
可变参数传递
Java 类有时声明一个具有可变数量参数(varargs)的方法来使用索引。
public class JavaArrayExample {
public void removeIndices(int... indices) {
// 在此编码……
}
}
在这种情况下,你需要使用展开运算符 * 来传递 IntArray:
val javaObj = JavaArray()
val array = intArrayOf(0, 1, 2, 3)
javaObj.removeIndicesVarArg(*array)
目前无法传递 null 给一个声明为可变参数的方法。
Java 反射
Java 反射适用于 Kotlin 类,反之亦然。
如上所述,你可以使用 instance::class.java, ClassName::class.java 或者 instance.javaClass 通过 java.lang.Class 来进入 Java 反射。
其他支持的情况包括为一个 Kotlin 属性获取一个 Java 的 getter/setter 方法或者幕后字段、
为一个 Java 字段获取一个 KProperty、为一个 KFunction 获取一个 Java 方法或者构造函数,反之亦然
已映射类型
| Java 类型 | Kotlin 类型 |
|---|---|
| byte | kotlin.Byte |
| short | kotlin.Short |
| int | kotlin.Int |
| long | kotlin.Long |
| char | kotlin.Char |
| float | kotlin.Float |
| double | kotlin.Double |
| boolean | kotlin.Boolean |
一些非原生的内置类型也会作映射:
| 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 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? |
请注意,用作类型参数的装箱原始类型映射到平台类型: 例如,List
最后欢迎加入Kotlin QQ群,一起讨论学习:

欢迎关注 微信公号

本文介绍如何在Kotlin中调用Java代码,并在Java中调用Kotlin代码,涉及循环、静态方法、可变参数传递等知识点,同时提供Java反射在Kotlin中的应用示例及类型映射说明。
830

被折叠的 条评论
为什么被折叠?



