Kotlin 调用 Java 代码
1. 基本互操作性
Kotlin 被设计为与 Java 100% 互操作,可以直接调用 Java 代码而无需特殊适配:
// 调用 Java 类
val javaList = java.util.ArrayList<String>()
javaList.add("Kotlin调用Java")
// 调用 Java 静态方法
val timestamp = System.currentTimeMillis()
2. 类型映射规则
| Java 类型 | Kotlin 类型 |
|---|---|
java.lang.Object | kotlin.Any! |
int | kotlin.Int |
java.lang.Integer | kotlin.Int? |
void | kotlin.Unit |
3. 空安全处理
Kotlin 通过平台类型(Platform Types)处理 Java 的可空性:
// Java 方法:public String getUserName() { ... }
val name: String = javaObj.userName // 非空断言
val name: String? = javaObj.userName // 可空声明
4. Getter/Setter 转换
Java 的 get/set 方法在 Kotlin 中自动转换为属性:
// Java 类
public class User {
private String name;
public String getName() { return name; }
public void setName(String name) { this.name = name; }
}
// Kotlin 调用
val user = User()
user.name = "Kotlin" // 实际调用setName()
println(user.name) // 实际调用getName()
5. 特殊语法处理
5.1 避免关键字冲突
使用反引号转义 Java 方法名中的 Kotlin 关键字:
// Java: public void is(String in) { ... }
javaObj.`is`("keyword")
5.2 数组处理
// Java 方法:public String[] getTags() { ... }
val tags: Array<String> = javaObj.tags // 注意不是 String[]
6. SAM 转换
单抽象方法(SAM)接口自动转换为 Lambda:
// Java 接口
public interface Runnable {
void run();
}
// Kotlin 调用
val runnable = Runnable { println("SAM conversion") }
7. 异常处理
Kotlin 不强制捕获 Java 的受检异常:
// Java: public void save() throws IOException { ... }
fun saveData() {
javaObj.save() // 不需要 try-catch
}
最佳实践
- 为关键 Java 类添加
@Nullable/@NotNull注解 - 使用
typealias简化复杂泛型类型 - 对频繁调用的 Java 方法考虑编写 Kotlin 扩展函数
提示:IntelliJ IDEA 提供 "Convert Java File to Kotlin File" 功能(Ctrl+Alt+Shift+K),可自动处理大部分互操作问题。
