首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java将数组转换为参数

Java将数组转换为参数
EN

Stack Overflow用户
提问于 2010-10-22 12:23:39
回答 3查看 8.4K关注 0票数 9

有没有一种方法可以将数组转换为参数列表?

代码语言:javascript
运行
复制
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“转换成一个参数/参数列表,这样它就会自动调用适当的函数。

EN

回答 3

Stack Overflow用户

发布于 2010-10-22 12:24:46

代码语言:javascript
运行
复制
main(){
   int[] a = {1,2,3};
   MyPrint(a);
}

void MyPrint(int... x){
//Do Stuff to arguments (accessing them by its index)
}
票数 8
EN

Stack Overflow用户

发布于 2010-10-22 12:50:32

做你想做的事情是非常奇怪的。如果你正在寻找一种通用的方法来做这件事,你需要深入研究反射(java.lang.reflect)。如果你真的有一个带有1、2或3个整数的数组/集合,并且想要基于此调用一个不同的方法,那么只需编写一个方法来计算"thing“中的值的数量并调用适当的方法即可。

你能告诉我们为什么要这样做吗?

编辑:

硬编码方式的代码:

代码语言:javascript
运行
复制
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处理错误,但这是一个起点):

代码语言:javascript
运行
复制
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 + ")");
    }
}

编辑...最后一个--这个方法适用于任何方法(将方法的名称传递给它)。这是最不安全的--名字中的一个拼写错误会毁了你的一天:-)

代码语言:javascript
运行
复制
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
EN

Stack Overflow用户

发布于 2010-10-22 12:45:46

简而言之,这真的是不可能的。接受可变数量参数的唯一方法是使用int...x构造。否则,您必须找出a中有多少个元素,然后找出要调用哪个元素。

代码语言:javascript
运行
复制
if (a.length == 2) {
    MyPrint(a[0], a[1]);
}
else if (a.length == 3) {
    MyPrint(a[0], a[1], a[2]);
}
// etc
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3993869

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档