繁体   English   中英

Java传递参数数组

[英]Java Pass Array of Arguments

您如何传递参数数组,例如python的f(*args)

其他语言的示例:

Python: f(*args)

JavaScript: f.apply(this, args)

红宝石: f(*args)

类似于我可以将数组作为参数传递给Java中具有可变参数的方法吗? varargs以及'...'参数 ,但函数声明不使用传播语法。

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

另外,当参数不是同一类型时,这可能吗?

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

您可以通过反射来做到这一点,但是使用一次初始化的缓存方法句柄,然后根据需要重复使用多次,可能会更有效率。

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)

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

这种样式的调用方法在Java语言中并不常见,但在反射API中是可能的:

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

进一步阅读

它在Java中非常相似,但是所有的类型必须相同:

Java: f(String... args);

它称为“ Varargs”,因此您可以在这个世界上搜索更多信息

要传递未知数量的变量,您可以执行以下操作:

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

检索您将执行的操作:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM