Java集合在Kotlin中默认映射为只读类型,如ArrayList→List、HashMap→Map;需修改时须显式转为可变类型或调用Java原生方法;Kotlin集合传入Java自动适配,但不可变集合被修改将抛UnsupportedOperationException;泛型擦除导致平台类型(如List),空安全需靠Java端注解保障;Iterator映射为平台类型,数组则按类型精确映射。

Java集合在Kotlin中默认映射为只读类型
Java的ArrayList、HashMap等集合类,在Kotlin中被自动映射为对应只读接口,例如java.util.ArrayList → List,java.util.HashMap → Map。这种映射不带可变性标记,意味着你无法直接调用add()或put()等修改方法——编译器会报错。
如果需要修改,必须显式转换为可变类型:
- 用
toMutableList()、toMutableMap()创建副本(适合小数据量、不介意拷贝开销的场景) - 用
as MutableList强制类型转换(需确保底层确实是可变实现,否则运行时抛ClassCastException) - 直接调用原始Java对象的方法,如
javaList.add("item")(此时变量仍为平台类型,Kotlin不校验可变性)
Kotlin集合传给Java时自动适配为标准Java接口
Kotlin的mutableListOf()或hashMapOf()传入Java方法时,会被无缝识别为java.util.List或java.util.Map,无需额外转换。这是因为Kotlin集合类本身实现了对应Java接口。
但要注意两点:
-
listOf()生成的是不可变集合,传给Java后,若Java代码尝试修改(如list.add()),会触发UnsupportedOperationException - 平台类型(如
List)在Java侧无感知,但Kotlin调用其方法时可能绕过空安全检查,建议用! @NotNull/@Nullable注解标注Java方法参数以提升互操作准确性
泛型擦除带来的平台类型问题
Java泛型在运行时被擦除,Kotlin无法在编译期确定确切类型。例如List在Kotlin中映射为List,末尾的!表示“平台类型”——既不是明确可空,也不是明确非空。
这意味着:
- 你可以把它当作
List用,也可以当作List用,但编译器不做强制约束 - 从Java返回的
ArrayList若含null元素,Kotlin访问时可能触发NPE,除非你主动声明为List - 推荐在Java端使用
@NonNullApi(Spring)或@ParametersAreNonnullByDefault(JSR-305)统一约束,减少平台类型歧义
迭代器与数组的特殊映射规则
Java的Iterator在Kotlin中映射为Iterator,属于平台类型;而Iterable则映射为Iterable(非空)。这意味着对Java返回的迭代器,Kotlin不会自动插入空检查。
Java数组映射更直接:String[] → Array,int[] → IntArray。但注意:
-
Array是引用类型数组,对应String[];而IntArray是JVM原生int[],性能更好,但不能和Array混用 - 从Java接收
Object[]时,Kotlin映射为Array,访问元素前建议判空或使用安全调用?.toString()
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











