2013-10-05 1 views
2

случай 1:Может ли аргумент переменной длины заменять один размерный массив?

Class Test{ 
    public static void m1(int[] x){ 
     /* some code here */ 
    } 
} 

случай 2:

Class Test{ 
    public static void m1(int... x){ 
     /* some code here */ 
    } 
} 

Теперь скажите мне, если случай 2 применим или нет? Если да, то, пожалуйста, объясните мне с точки зрения компилятора. Другой вопрос: может ли одномерный массив заменить один аргумент длины переменной?

+3

Что вы подразумеваете под: «применим ли случай 2 или нет?». – Rohan

ответ

0

В случае, если компилятор 2 записывает для вас код массива. Вы можете прочитать статью this для описания того, что происходит, когда вы добавляете аргумент переменной длины.

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

0

Вместо того, чтобы создавать массив, а затем передавать его как параметр функции, вы можете использовать varargs. Хотя, если вы хотите передать несколько массивов вашему параметру и управлять ими отдельно, вы, вероятно, не должны использовать varargs.

В качестве ответа на ваш вопрос оба случая: :. Оба параметра array и varargs будут обрабатываться одинаково в вашей функции. Это действительно зависит от вас, чтобы выбрать, какой из них лучше всего подходит для вашей ситуации.

0

С точки зрения составителей:

  • case1: Длина x известен во время выполнения. x находится где-то на куче, и ссылка на x ставится на стек, когда вызывается m1.
  • case2: Длина строки x известна во время компиляции, потому что исходный код явно отображает все int-параметры. Каждый int помещается в стек, когда вызывается m1.

Фактически другой случай. Вы можете позвонить m1 из case2 с m1(new int[] {3,4,5});, который ведет к обработке стека, как в case1.

Смежные вопросы