gpt4 book ai didi

java - String.format 在 Kotlin 和 Java 中工作异常

转载 作者:行者123 更新时间:2023-11-29 06:49:04 27 4
gpt4 key购买 nike

我试图将代码库从 Java 迁移到 Kotlin。但是我在 String.format 中发现了奇怪的行为。

我在 Kotlin 和 Java 中都有相同的代码(和功能)。

fun callScriptMethod(methodName: String, vararg args: Any): String {
var format = methodName
if (!format.contains("javascript:")) {
format = String.format("javascript:%s", format)
}

val objects = mutableListOf<Any>()
for (arg in args) objects.add(arg)

if (!objects.isEmpty()) {
format += "("
var i = 0
val icnt = objects.size
while (i < icnt) {
format += "\'%s\'"
if (i != icnt - 1) {
format += ", "
}
i++
}

format += ")"
} else {
format += "()"
}

val message = String.format(Locale.getDefault(), format, args)
return message
}
public static String callScriptMethod(String methodName, Object... args) {
String format = methodName;
if (!format.contains("javascript:")) {
format = String.format("javascript:%s", format);
}

List<Object> objects = Arrays.asList(args);
if (!objects.isEmpty()) {
format += "(";
for (int i = 0, icnt = objects.size(); i < icnt; i++) {
format += "\'%s\'";
if (i != icnt - 1) {
format += ", ";
}
}

format += ")";
} else {
format += "()";
}

String message = String.format(format, args);
return message;
}

和一些测试代码。

fun main() {
val result = Java.callScriptMethod("nativeCallback", "1", "d8d8441n24n134n",
"dasqhjidhkdhaskjdfhawoiudnqwaidnqwioldjnqawskld:djoashdojashdlkjasdjhas", "0")
println(result)

val result2 = Kotlin.callScriptMethod("nativeCallback", "1", "d8d8441n24n134n",
"dasqhjidhkdhaskjdfhawoiudnqwaidnqwioldjnqawskld:djoashdojashdlkjasdjhas", "0")
println(result2)
}

我可以预期结果是 javascript:nativeCallback('1', 'd8d8441n24n134n', 'dasqhjidhkdhaskjdfhawoiudnqwaidnqwioldjnqawskld:djoashdojashdlkjasdjhas', '0')

但是Kotlin版本有异常MissingFormatArgumentException

因此,我尝试调试这些代码以了解格式是否已成功生成。

Java:javascript:nativeCallback('%s', '%s', '%s', '%s')

Kotlin :javascript:nativeCallback('%s', '%s', '%s', '%s')

两者的结果相同,args 相同,但结果不同。

javascript:nativeCallback('1', 'd8d8441n24n134n', 'dasqhjidhkdhaskjdfhawoiudnqwaidnqwioldjnqawskld:djoashdojashdlkjasdjhas', '0')
Exception in thread "main" java.util.MissingFormatArgumentException: Format specifier '%s'
at java.util.Formatter.format(Formatter.java:2519)
at java.util.Formatter.format(Formatter.java:2455)
at java.lang.String.format(String.java:2981)
at Kotlin.callScriptMethod(Kotlin.kt:31)
at TestKt.main(test.kt:11)
at TestKt.main(test.kt)

所以,我想知道是什么问题。我该怎么办?

最佳答案

由于可变参数一旦进入函数体就变成了数组,您必须使用spread 运算符才能将其作为可变参数传递。 https://kotlinlang.org/docs/reference/functions.html#variable-number-of-arguments-varargs

When we call a vararg-function, we can pass arguments one-by-one, e.g. asList(1, 2, 3), or, if we already have an array and want to pass its contents to the function, we use the spread operator (prefix the array with *):

val message = String.format( format, *args)

与 Java 的不同之处在于 Java 实际上允许直接将数组作为 vararg 传递,请参阅此 SO 帖子:Can I pass an array as arguments to a method with variable arguments in Java?

即Java 中的 Object... 在技术上等同于 Object[],Java 中没有“真正的”可变参数,而 vararg 是一个Kotlin 中真正不同的东西。

关于java - String.format 在 Kotlin 和 Java 中工作异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55623952/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com