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

Java集合在Kotlin中默认映射为只读类型
Java的ArrayList、HashMap等集合类,在Kotlin中被自动映射为对应只读接口,例如java.util.ArrayList<string></string> → List<string></string>,java.util.HashMap<k v></k> → Map<k v></k>。这种映射不带可变性标记,意味着你无法直接调用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接口。
但要注意两点:
立即学习“Java免费学习笔记(深入)”;
-
listOf()生成的是不可变集合,传给Java后,若Java代码尝试修改(如list.add()),会触发UnsupportedOperationException - 平台类型(如
List<string>!</string>)在Java侧无感知,但Kotlin调用其方法时可能绕过空安全检查,建议用@NotNull/@Nullable注解标注Java方法参数以提升互操作准确性
泛型擦除带来的平台类型问题
Java泛型在运行时被擦除,Kotlin无法在编译期确定确切类型。例如List<integer></integer>在Kotlin中映射为List<int></int>,末尾的!表示“平台类型”——既不是明确可空,也不是明确非空。
这意味着:
- 你可以把它当作
List<int></int>用,也可以当作List<int></int>用,但编译器不做强制约束 - 从Java返回的
ArrayList<string></string>若含null元素,Kotlin访问时可能触发NPE,除非你主动声明为List<string></string> - 推荐在Java端使用
@NonNullApi(Spring)或@ParametersAreNonnullByDefault(JSR-305)统一约束,减少平台类型歧义
迭代器与数组的特殊映射规则
Java的Iterator<t></t>在Kotlin中映射为Iterator<t></t>,属于平台类型;而Iterable<t></t>则映射为Iterable<t></t>(非空)。这意味着对Java返回的迭代器,Kotlin不会自动插入空检查。
Java数组映射更直接:String[] → Array<string></string>,int[] → IntArray。但注意:
-
Array<string></string>是引用类型数组,对应String[];而IntArray是JVM原生int[],性能更好,但不能和Array<int></int>混用 - 从Java接收
Object[]时,Kotlin映射为Array<any></any>,访问元素前建议判空或使用安全调用?.toString()


















