1 空安全(Null Safety)
Kotlin 有严格的空安全机制(如非空类型的 String
和可空类型 String?
),但是 Java 没有:
- Kotlin 代码调用 Java 代码:Java 中的所有引用类型默认都是可空的,Kotlin 需要手动处理空安全;
- Java 代码调用 Kotlin 代码:可能会传入
null
到非空参数,导致运行时NullPointerException
;
示例:
// Java 类
public class Person {
private String name; // 可能为 null
public String getName() {
return name;
}
}
// Kotlin 调用 Java 方法
val person = Person()
val name: String = person.name // 可能为空
val safeName: String = person.name ?: "" // 空安全处理
解决方案:
- 在 Kotlin 调用 Java 代码时,始终假设 Java 方法可能返回
null
,使用?.
、?:
或!!
处理; - 在 Java 调用 Kotlin 代码时,为调用方法的属性添加
@Nullable
或NotNull
注解;
fun processString(@NotNull text: String) {
}
2 集合类型互操作
Kotlin 的集合分为只读(List
)和可变(MutableList
),而 Java 的集合均为可变集合。混合使用时可能导致意外修改。
示例:
val list: List<String> = mutableListOf("a", "b")
// Java 调用时
public void processList(List<String> list) {
list.add("c"); // 运行时可能抛出 UnsupportedOperationException
}
解决方案:
- 在 Kotlin 中返回集合时,明确指定是
MutableList
还是List
; - 在 Java 中调用 Kotlin 代码时,注意集合的可变性,避免修改不可变集合;
3 静态成员和伴生对象
Kotlin 中的伴生对象(companion object
)在 Java 中需要通过 Companion
类访问,无法直接调用静态方法。
解决方案:使用 @JvmStatic
注解将半生对象的方法暴露为静态方法。
示例:
companion object {
@JvmStatic fun staticMethod() { }
}
4 默认参数和重载
Kotlin 支持默认参数,但 Java 不支持。在 Java 中调用带默认参数的 Kotlin 方法是,必须传递所有参数。
解决方案:使用 @JvmOverloads
注解生成多个重载方法。
示例:
@JvmOverloads
fun greet(name: String, prefix: String = "Hello") {
}
Java 中可选择性传参:greet("Eileen")
或 greet("Eileen", "Hi")
4 数据类和 JavaBean
Java 不能识别 Kotlin 数据类:Java 代码无法直接使用 Kotlin 数据类的特性(如 copy()
、解构声明)。
Getter/Setter
命名:Kotlin 的 var
属性默认生成 getX()
和 setX()
方法,与 JavaBean 规范一致,但 val
仅生成 getX()
。
data class User(val name: String, var age: Int)
// Java 调用
User user = new User("Eileen", 34);
user.getAge(); // 正常
user.setName("Bob"); // 编译错误,name 是 val
解决方案:
- 确保 Kotlin 数据类的属性符合 JavaBean 规范,使用
var
而非val
; - 在需要与 Java 深度交互的类上使用
JvmFiled
注解,避免生成Getter/Setter
;