Java Pass参数数组

时间:2018-02-15 22:01:42

标签: java arrays function methods

如何传递一组参数,例如python' s f(*args)

其他语言的示例:

Python:f(*args)

JavaScript:f.apply(this, args)

Ruby:f(*args)

Can I pass an array as arguments to a method with variable arguments in Java?varargs and the '...' argument类似,但函数声明不使用扩展语法。

void draw(int x, int y) {
    ...
}

另外,当参数不是完全相同的类型时,这是否可能?

void draw(int x, String y) {
    ...
}

4 个答案:

答案 0 :(得分:2)

您可以使用反射执行此操作,但使用初始化一次的缓存方法句柄可能更高效,然后根据需要重复使用多次。

class SpreadInvoker {
    public static void draw1(int x, String y) {
        System.out.printf("draw1(%s, %s)%n", x, y);
    }

    public void draw2(int x, int y) {
        System.out.printf("draw2(%s, %s)%n", x, y);
    }

    static MethodHandle DRAW1;
    static MethodHandle DRAW2;

    public static void main(String[] args) throws Throwable {
        DRAW1 = MethodHandles.lookup()
                             .findStatic(
                                 SpreadInvoker.class,
                                 "draw1",
                                 MethodType.methodType(
                                     void.class,
                                     int.class,
                                     String.class
                                 )
                             )
                             .asSpreader(Object[].class, 2);

        DRAW2 = MethodHandles.lookup()
                             .findVirtual(
                                 SpreadInvoker.class,
                                 "draw2",
                                 MethodType.methodType(
                                     void.class,
                                     int.class,
                                     int.class
                                 )
                             ).asSpreader(Object[].class, 2);

        SpreadInvoker instance = new SpreadInvoker();

        final Object[] args1 = { 13, "twenty-six" };
        final Object[] args2 = { 13, 26 };

        DRAW1.invoke(args1);           // SpreadInvoker.draw1(13, "twenty-six")
        DRAW2.invoke(instance, args2); // instance.draw2(13, 26)
    }
}

输出:

  

draw1(13,26)
  draw2(13,26)

但请注意,如果您不知道在编译时需要调用哪种方法,那么这就是您要做的事情。这种事情几乎不应该是必要的。

答案 1 :(得分:1)

这种调用方法对于Java语言来说并不常见,但可以使用反射API:

    Method drawMethod = YourClass.class.getDeclaredMethod("draw", new Class[] { int.class, int.class });
    drawMethod.invoke(null, (Object[]) args);

Further reading

答案 2 :(得分:0)

它在java中非常相似,但它们都必须是相同的类型:

Java:f(String... args);

它呼唤" Varargs"所以你可以通过这个世界谷歌获取更多信息

答案 3 :(得分:0)

要传递未知数量的变量:

public void getNumber(int...args){
      ...
}

要检索你会这样做:

args[0], args[1], args[2], ...