kotlin反映和vararg

时间:2017-07-30 15:38:57

标签: java kotlin

我正在尝试用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)
    }
}

1 个答案:

答案 0 :(得分:2)

您可能希望将b(args)替换为b(*args),将method.invoke(this, args)替换为method.invoke(this, *args)*spread operator,可用于将大小为n(在本例中为args)的数组展开为大小为n的变量。

这是必需的,因为您可能也希望将名为args的数组作为唯一参数而不是其内容传递。我不确定Java代码是否也被破坏了,但由于catch - 阻止,测试通过了。

顺便说一句,请在下次详细描述您所面临的错误。说明你实际遇到的问题以及你期望的行为,而不仅仅是给我们一些代码。