2010-08-26 3 views

ответ

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

Существует два способа использования переменной длиной в Java

public static void main(String... args) 

Или

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

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

main("hello", "world"); 

или

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

Это не может быть на самом деле то, что ОП просит - похоже, они просят, если они могут передать массив аргументов функции, не vararg. – Amber

+0

Действительно - это противоположность varargs. OP хочет вызвать метод non-array-argument с массивом в качестве аргумента. – gustafc

+0

А, я просто понял, что массивы не являются объектами в java, поэтому нет никакой двусмысленности, если вы передадите только один аргумент. Спасибо! :) – mik01aj

4

Метод может быть объявлен параметром 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); 
0

Здесь мы прошли пылкий метод на вызов метода, смотрите пример ниже,

check the source

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

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

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

Поскольку ваш метод написан внутри оператора печати. ваше возвращаемое значение также будет напечатано в этой программе. Итак, ниже приведен код.

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 
Смежные вопросы