
在 kotlin 中调用含 varargs 的 java 重载方法时,编译器可能因类型推导优先选择 varargs 版本,导致本意调用的固定参数方法(如 `update(string, object[], int[])`)被错误跳过。本文详解如何通过类型显式转换强制匹配目标重载。
当从 Kotlin 调用 Spring JDBC 的 JdbcTemplate.update() 方法时,若 Java 端存在两个重载签名:
int update(String sql, Object[] args, int[] argTypes); // ✅ 目标:三参数版本 int update(String sql, Object... args); // ❌ 实际调用:二参数 varargs 版本
Kotlin 编译器会默认将 Array
根本原因在于 Kotlin 与 JVM 类型映射的差异:
- Array
→ JVM Integer[](对象数组,非原始 int[]) - IntArray → JVM int[](原始类型数组)
而 Java 方法签名要求的是 int[](原始类型),不是 Integer[] —— 因此 Array无法精确匹配 int[] 参数,编译器被迫退回到更宽松的 varargs 版本。
✅ 正确解决方案是显式转换为原始类型数组:
立即学习“Java免费学习笔记(深入)”;
val sql = "INSERT INTO \"$sourceTable\" ($insertList) VALUES ($valueList)" val p: Array= params.toTypedArray() val c: List = columnTypes // 假设 columnTypes 是 List // 关键修正:使用 toIntArray() 将 List → IntArray → JVM int[] targetJdbcTemplate.update(sql, p, c.toIntArray())
⚠️ 注意事项:
- c.toIntArray() 仅适用于 List
或 IntArray 源;若 columnTypes 本身是 Array ,需先转为 List 再调用:(columnTypes.toList()).toIntArray(); - Array
已正确对应 Object[],无需额外转换(Kotlin 的 Array 默认映射为 JVM 对象数组); - 若需调用其他原始类型数组参数(如 long[], boolean[]),应分别使用 toLongArray()、toBooleanArray() 等对应扩展函数;
- 避免使用 arrayOf(...) 构造 Array
后传入——它仍生成 Integer[],无法满足 int[] 要求。
? 总结:Kotlin 调用含原始类型数组参数的 Java 重载方法时,必须使用 xxxArray() 扩展函数(如 toIntArray())生成对应原始类型数组,而非依赖泛型 Array










