有没有办法将数组转换为参数列表..?
main(){
//"a" is an array or a list or some collection
myPrint(a.SomeMethod);
}
void myPrint(int a){
//Do Stuff to arguments
}
void myPrint(int a, int b){
//Do Stuff to arguments
}
void myPrint(int a, int b, int c){
//Do Stuff to arguments
}
我想将“a”转换为参数/参数列表,以便自动调用相应的函数。
答案 0 :(得分:8)
main(){
int[] a = {1,2,3};
MyPrint(a);
}
void MyPrint(int... x){
//Do Stuff to arguments (accessing them by its index)
}
答案 1 :(得分:2)
做你想做的事情是非常奇怪的。如果您正在寻找一种通用的方法,那么您需要深入研究反射(java.lang.reflect)。如果你真的有一个包含1,2或3个int的数组/集合,并且想要根据它调用一个不同的方法,那么只需编写一个方法来计算“thing”中的值的数量并调用适当的方法。 / p>
你能告诉我们你为什么要这样做吗?
编辑:
硬编码方式的代码:
public class Main
{
public static void main(String[] args)
{
final Main main;
main = new Main();
main.callFoo(new int[] {1});
main.callFoo(new int[] {1, 2});
main.callFoo(new int[] {1, 2, 3});
}
private void callFoo(final int[] values)
{
if(values.length == 1)
{
foo(values[0]);
}
else if(values.length == 2)
{
foo(values[0], values[1]);
}
else if(values.length == 3)
{
foo(values[0], values[1], values[2]);
}
else
{
throw new Error("too many values: " + values.length);
}
}
private void foo(int a)
{
System.out.println("foo(" + a + ")");
}
private void foo(int a, int b)
{
System.out.println("foo(" + a + ", " + b + ")");
}
private void foo(int a, int b, int c)
{
System.out.println("foo(" + a + ", " + b + ", " + c + ")");
}
}
这是反射版本(我不会通过printStackTrace处理错误,但它是一个起点):
public class Main
{
public static void main(String[] args)
{
final Main main;
main = new Main();
main.callFoo(new int[] {1});
main.callFoo(new int[] {1, 2});
main.callFoo(new int[] {1, 2, 3});
}
private void callFoo(final int[] values)
{
final Class[] parameters;
parameters = new Class[values.length];
for(int i = 0; i < parameters.length; i++)
{
parameters[i] = int.class;
}
try
{
final Method method;
final Object[] args;
method = Main.class.getDeclaredMethod("foo", parameters);
args = new Object[values.length];
for(int i = 0; i < args.length; i++)
{
args[i] = Integer.valueOf(values[i]);
}
method.invoke(this, args);
}
catch(final IllegalAccessException ex)
{
ex.printStackTrace();
}
catch(final IllegalArgumentException ex)
{
ex.printStackTrace();
}
catch(final InvocationTargetException ex)
{
ex.printStackTrace();
}
catch(final NoSuchMethodException ex)
{
ex.printStackTrace();
}
catch(final SecurityException ex)
{
ex.printStackTrace();
}
}
private void foo(int a)
{
System.out.println("foo(" + a + ")");
}
private void foo(int a, int b)
{
System.out.println("foo(" + a + ", " + b + ")");
}
private void foo(int a, int b, int c)
{
System.out.println("foo(" + a + ", " + b + ", " + c + ")");
}
}
编辑...最后一个 - 这个适用于任何方法(您传递方法的名称)。这是最安全的一个 - 名字中的拼写错误可能毁了你的一天: - )
public class Main
{
public static void main(String[] args)
{
final Main main;
main = new Main();
main.call("foo", new int[] {1});
main.call("foo", new int[] {1, 2});
main.call("foo", new int[] {1, 2, 3});
main.call("bar", new int[] {1});
main.call("bar", new int[] {1, 2});
main.call("bar", new int[] {1, 2, 3});
}
private void call(final String methodName,
final int[] values)
{
final Class[] parameters;
parameters = new Class[values.length];
for(int i = 0; i < parameters.length; i++)
{
parameters[i] = int.class;
}
try
{
final Method method;
final Object[] args;
method = Main.class.getDeclaredMethod(methodName, parameters);
args = new Object[values.length];
for(int i = 0; i < args.length; i++)
{
args[i] = Integer.valueOf(values[i]);
}
method.invoke(this, args);
}
catch(final IllegalAccessException ex)
{
ex.printStackTrace();
}
catch(final IllegalArgumentException ex)
{
ex.printStackTrace();
}
catch(final InvocationTargetException ex)
{
ex.printStackTrace();
}
catch(final NoSuchMethodException ex)
{
ex.printStackTrace();
}
catch(final SecurityException ex)
{
ex.printStackTrace();
}
}
private void foo(int a)
{
System.out.println("foo(" + a + ")");
}
private void foo(int a, int b)
{
System.out.println("foo(" + a + ", " + b + ")");
}
private void foo(int a, int b, int c)
{
System.out.println("foo(" + a + ", " + b + ", " + c + ")");
}
private void bar(int a)
{
System.out.println("bar(" + a + ")");
}
private void bar(int a, int b)
{
System.out.println("bar(" + a + ", " + b + ")");
}
private void bar(int a, int b, int c)
{
System.out.println("bar(" + a + ", " + b + ", " + c + ")");
}
}
答案 2 :(得分:0)
简而言之,这真的是不可能的。采用可变数量参数的唯一方法是使用int...x
构造。否则,您必须弄清a
中有多少元素,然后找出要调用的元素。
if (a.length == 2) {
MyPrint(a[0], a[1]);
}
else if (a.length == 3) {
MyPrint(a[0], a[1], a[2]);
}
// etc