我正在尝试用kotlin替换Java,但是vararg的传输存在问题。
测试在java中传递
public class ExampleUnitTest1 {
@Test
public void test() {
a(1, 2);
}
public void a(Object... args) {
b(args);
}
public void b(Object... args) {
Class clazz1 = ExampleUnitTest1.class;
try {
Method method = clazz1.getMethod("add", Integer.class, Integer.class);
method.invoke(this, args);
} catch (Exception e) {
e.printStackTrace();
}
}
public void add(Integer a, Integer b) {
System.out.println(a + b);
}
}
但是kotlin的测试失败
class ExampleUnitTest {
@Test
fun test() {
a(1, 2)
}
fun a(vararg args: Any) {
b(args)
}
fun b(vararg args: Any) {
val clazz1 = ExampleUnitTest::class.java
val method = clazz1.getMethod("add", Int::class.java, Int::class.java)
method.invoke(this, args) // also failed to replace with args[0]
}
fun add(a: Int, b: Int) {
println(a + b)
}
}
答案 0 :(得分:2)
您可能希望将b(args)
替换为b(*args)
,将method.invoke(this, args)
替换为method.invoke(this, *args)
。 *
是spread operator,可用于将大小为n
(在本例中为args
)的数组展开为大小为n
的变量。
这是必需的,因为您可能也希望将名为args
的数组作为唯一参数而不是其内容传递。我不确定Java代码是否也被破坏了,但由于catch
- 阻止,测试通过了。
顺便说一句,请在下次详细描述您所面临的错误。说明你实际遇到的问题以及你期望的行为,而不仅仅是给我们一些代码。