如何将args传递给java中的方法,比如python中的f(* args)?

时间:2010-08-26 08:08:02

标签: java python arguments variadic-functions

在python中,我可以这样做:

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

这在java中是否可行?

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

4 个答案:

答案 0 :(得分:4)

当然,你应该能够使用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

不能为非vararg方法执行此操作。但是,非vararg方法具有固定数量的参数,因此您应该能够执行

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

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

答案 1 :(得分:4)

可以使用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);

答案 2 :(得分:1)

在java中使用varargs有两种方法

public static void main(String... args)

或者

public static void main(String[] args)

在我的例子中,它是字符串,但你也可以使用int。

要调用它们(这适用于两者),

main("hello", "world");

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

答案 3 :(得分:0)

这里我们已经将arguemnts传递给方法调用的方法,参见下面的例子,

check the source

示例说明如下;

我们有一个值为10的int变量,它是一个方法局部变量。然后我们在print语句中调用方法m(int x)。然后在m(int x)中有一个参数int x variable,这个x也是一个方法局部变量。您只能在此方法中访问它。然后在inside方法中打印x的值,即10,因为在方法调用时,参数传递y,其保持值10.值10被赋值给方法的方法局部变量x,在内部声明方法参数。现在,当我们打印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