java Kotlin->API调用没有使用我想要的方法,因为varargs方法正在吞噬所有方法参数

flvtvl50  于 2023-01-29  发布在  Java
关注(0)|答案(2)|浏览(111)

我从Kotlin调用Spring方法,Spring提供了2个签名,一个接受2个参数(第二个是varargs),另一个接受3个参数。
我想调用3-arg方法,但是我不知道如何匹配类型--它一直在调用2-arg版本,而varargs会发出声音。
下面是方法签名(我想调用第一个,但它一直在调用第二个):

@Override
public int update(String sql, Object[] args, int[] argTypes) throws DataAccessException {
    return update(sql, newArgTypePreparedStatementSetter(args, argTypes));
}

@Override
public int update(String sql, @Nullable Object... args) throws DataAccessException {
    return update(sql, newArgPreparedStatementSetter(args));
}

下面是我的Kotlin代码:

var sql = "INSERT INTO \"$sourceTable\" ($insertList) VALUES ($valueList)"
val p: Array<Any?> = params.toTypedArray()
val c: Array<Int> = columnTypes.toTypedArray()
targetJdbcTemplate.update(sql, p, c)

显然,有些地方出了问题,Array没有Map到Object[],因为调试器显示我在这里调用的是第二个方法,而不是第一个。
如何让Kotlin知道我想要哪个方法?如何将Array<Any?>Array<Int>Map到Object[]Int[],以便编译器能够理解?

hgc7kmma

hgc7kmma1#

在Kotlin,Array<Int>是一个幕后的Integer[],而IntArray是一个int[](参见here)。
要解决此问题,可以将最后一行的c更改为c.toIntArray()

targetJdbcTemplate.update(sql, p, c.toIntArray())
93ze6v8z

93ze6v8z2#

在执行Kotlin-〉Java interrop时,Kotlin有特定的Array类型来帮助处理这种不明确的Type。
在这种情况下,您需要在Kotlin中使用IntArray来Map到Java中的适当类型
还有许多其他基本数组类型,例如:字节数组、短数组、整数数组
参考:www.example.comhttps://kotlinlang.org/docs/arrays.html#primitive-type-arrays

相关问题