Как передать аргументы в метод в Java, как F (* Args) в Python? - PullRequest
8 голосов
/ 26 августа 2010

В питоне я могу сделать:

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

Возможно ли это в Java?

, чтобы уточнить - у f есть список аргументов переменной длины.

Ответы [ 4 ]

4 голосов
/ 26 августа 2010

Конечно, вы должны быть в состоянии точно сделать это, используя vararg-method .Если вас беспокоят двусмысленности, когда речь идет о таких аргументах, как 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]);

Более того, нет способа позволить компилятору разрешить ситуацию для перегруженных методов в зависимости от размера или типа массива.

4 голосов
/ 26 августа 2010

Метод может быть объявлен с параметром 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);
1 голос
/ 26 августа 2010

Существует два способа использования varargs в java

public static void main(String... args)

или

public static void main(String[] args)

В моем примере это строка, но вы можете сделать это и с помощью int.

Чтобы позвонить им (это работает на обоих),

main("hello", "world");

или

main(new String[]{"hello", "world"});
0 голосов
/ 21 июня 2014

Здесь мы передали аргумент аргументу при вызове метода, см. Пример ниже,

проверить источник

Описание для примера ниже;

Там у нас есть переменная int со значением 10, это локальная переменная метода. Затем мы вызываем наш метод m (int x) внутри оператора print. затем в m (int x) есть переменная параметра int x, этот x также является локальной переменной метода. Вы можете получить к нему доступ только в этом методе. Затем внутри метода вы выводите значение x, которое равно 10, потому что при вызове метода передается аргумент y, который содержит значение 10. Это значение 10 присваивается локальной переменной метода x, которая объявлена ​​внутри параметра метода. Теперь, когда мы позвоним, чтобы напечатать x, он напечатает 10.

Затем создайте другую локальную переменную метода, добавьте некоторое значение к значению x, присвойте и верните эту переменную. Вы возвращаете значение, так что теперь вы собираетесь проверить, что метод не void и имеет тип возвращаемого значения int, начиная с 10 в int.

Поскольку ваш метод написан внутри оператора 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
...