【问题标题】:How to pass args to method in java, like f(*args) in python?如何将 args 传递给 java 中的方法,如 python 中的 f(*args)?
【发布时间】:2011-04-04 03:26:51
【问题描述】:

在python中,我可以做到:

args = [1,2,3,4]
f(*args) # this calls f(1,2,3,4)

这在java中可能吗?

澄清 - f 有一个可变长度的参数列表。

【问题讨论】:

    标签: java python arguments variadic-functions


    【解决方案1】:

    当然,您应该能够使用vararg-methods 准确地做到这一点。如果您担心Object... 等参数的歧义,那么这段代码应该澄清一下:

    public class Test {
    
        public static void varargMethod(Object... args) {
            System.out.println("Arguments:");
            for (Object s : args) System.out.println(s);
        }
    
        public static void main(String[] args) throws Exception {
            varargMethod("Hello", "World", "!");
    
            String[] someArgs = { "Lorem", "ipsum", "dolor", "sit" };
    
            // Eclipse warns:
            //   The argument of type String[] should explicitly be cast to Object[]
            //   for the invocation of the varargs method varargMethod(Object...)
            //   from type Test. It could alternatively be cast to Object for a
            //   varargs invocation
            varargMethod(someArgs);
    
            // Calls the vararg method with multiple arguments
            // (the objects in the array).
            varargMethod((Object[]) someArgs);
    
            // Calls the vararg method with a single argument (the object array)
            varargMethod((Object) someArgs);
        }
    }
    

    输出:

    Arguments:
        Hello
        World
        !
    Arguments:
        Lorem
        ipsum
        dolor
        sit
    Arguments:
        Lorem
        ipsum
        dolor
        sit
    Arguments:
        [Ljava.lang.String;@1d9f953d
    

    不能为非可变参数方法做到这一点。但是,非可变参数方法具有固定数量的参数,因此您应该可以这样做

    nonVarargMethod(args[0], args[1], args[2]);
    

    此外,没有办法让编译器根据数组的大小或类型解决重载方法的情况

    【讨论】:

      【解决方案2】:

      如其他答案所建议的,可以使用 varargs 参数声明方法,并使用数组调用方法。

      如果您要调用的方法没有 varargs 参数,您可以通过自省来做类似的事情,虽然它有点笨拙:

      class MyClass {
        public void myMethod(int arg1, String arg2, Object arg3) {
          // ...code goes here...
        }
      }
      
      Class<MyClass> clazz = MyClass.class;
      Method method = clazz.getMethod("myMethod", Integer.TYPE, String.class, Object.class);
      
      MyClass instance = new MyClass();
      Object[] args = { Integer.valueOf(42), "Hello World", new AnyObjectYouLike() };
      method.invoke(instance, args);
      

      【讨论】:

        【解决方案3】:

        在java中有两种使用可变参数的方法

        public static void main(String... args)
        

        或者

        public static void main(String[] args)
        

        在我的示例中,它使用字符串,但您也可以使用 int。

        调用它们(这对两者都有效),

        main("hello", "world");
        

        main(new String[]{"hello", "world"});
        

        【讨论】:

        • 这实际上可能不是 OP 所要求的 - 似乎他们在询问是否可以将一组参数传递给非可变参数函数。
        • 确实 - 它与可变参数相反。 OP 想要调用一个以数组为参数的非数组参数方法。
        • 啊,我刚刚意识到数组不是java中的对象,所以如果你只传递一个参数就没有歧义。谢谢! :)
        • 我不明白你的意思。致电funct("a", "b", "c") public void funct(String s) ?!?
        • @m01 数组 java 中的对象。
        【解决方案4】:

        这里我们在方法调用时将argumentmnts传递给方法,见下面的例子,

        check the source

        示例说明如下;

        我们有一个值为 10 的 int 变量,它是一个方法局部变量。然后我们在 print 语句中调用我们的方法 m(int x)。然后在 m(int x) 中有一个参数 int x variable ,这个 x 也是一个方法局部变量。您只能在此方法中访问它。然后在方法内部打印 x 的值,即 10,因为在方法调用时传递了一个参数 y,它保存值 10。该值 10 被分配给方法的方法局部变量 x,该变量在方法参数内部声明。现在,当我们调用 print x 时,它会打印 10。

        然后创建另一个方法局部变量并将一些值添加到 x 值并分配并返回该变量。您正在返回一个值,所以现在您要检查该方法不是 void,并且具有 int 返回类型,因为 int 中的 10。

        由于您的方法是在 print 语句中编写的。您的返回值也会在此程序中打印出来。所以下面是代码。

        class A
        {
             static int m(int x)
             {
                  System.out.println("x : "+x);
                  int a= x+10;
                  System.out.println("a : "+a);
                  return a;
             }
        
        
            public static void main(String args[])
            {
                 int y=10;
                 System.out.println(m(y));
            }
        }
        

        输出:

        x : 10
        a: 20
        20
        

        【讨论】:

          猜你喜欢
          • 2014-08-22
          • 2012-11-18
          • 1970-01-01
          • 2021-12-01
          • 1970-01-01
          • 1970-01-01
          • 2020-01-11
          • 1970-01-01
          • 2020-05-11
          相关资源
          最近更新 更多