[英]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.