如何传递一组参数,例如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) {
...
}
答案 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);
答案 2 :(得分:0)
它在java中非常相似,但它们都必须是相同的类型:
Java:f(String... args);
它呼唤" Varargs"所以你可以通过这个世界谷歌获取更多信息
答案 3 :(得分:0)
要传递未知数量的变量:
public void getNumber(int...args){
...
}
要检索你会这样做:
args[0], args[1], args[2], ...