Являются ли String [] и String ... (Var-args) одинаковыми, когда они работают внутри? - PullRequest
7 голосов
/ 06 января 2012
class WrongOverloading{
    void something(String [] a){ .. }
    Integer something(String... aaa){ return 1;}
}

Выше код не компилируется! Компилятор говорит, что это дублирующие методы. Таким образом, использование массива String или String var-args означает одно и то же?

Как они реализованы внутри?

Ответы [ 9 ]

6 голосов
/ 06 января 2012

Они фактически одинаковы, за исключением того, что компилятор не примет varargs, если это не последний аргумент, и он не позволит вам передать несколько аргументов в массив.

public void methodA(int... ints, int a); // doesn't compile
public void methodA(int[] ints, int a); // compiles

public void methodB(int... ints); // compiles
public void methodC(int[] ints); // compiles

methodB(1); // compiles
methodB(1,2,3,4); // compiles
methodC(1); // doesn't compile
methodC(1,2,3,4); // doesn't compile
4 голосов
/ 06 января 2012

С это ТАК обсуждение

Базовым типом метода вариации function(Object... args) является function(Object[] args). Sun добавила varargs таким образом, чтобы сохранить обратная совместимость.

Итак, как сказал любой другой ответ, да, они одинаковы.

1 голос
/ 06 января 2012

Да, оба одинаковы ... http://docs.oracle.com/javase/1.5.0/docs/guide/language/varargs.html Просто прочитайте этот сайт, вы узнаете

1 голос
/ 06 января 2012

Компилятор за кулисами фактически преобразует ваш метод var args в метод с входом массива.По этой причине метод var args может быть перегружен массивом в качестве входных данных, поскольку после компиляции оба они будут идентичны.

1 голос
/ 06 января 2012

да, они одинаковы, потому что когда вы вызываете метод с elipsis (String ...), он преобразуется в массив String.

1 голос
/ 06 января 2012

Атрибут [vararg] указывает, что метод принимает переменное число параметров.Для этого последний параметр должен быть безопасным массивом типа VARIANT, который содержит все остальные параметры:

[vararg [, optional-attributes]] return-type function-name(
[optional-param-attributes] param-list,
SAFEARRAY(VARIANT) last-param-name);

Синтаксис varargs в основном позволяет вам указать, что есть возможные параметры, верно?Они могут быть там или не могут быть там.Это цель трех точек.Когда вы вызываете метод, вы можете вызывать его с этими параметрами или без них.Это было сделано, чтобы избежать необходимости передавать массивы в методы.

Посмотрите на this :

См. Когда вы используете varargs в Java?

final public class Main
{
    private void show(int []a)
    {
        for(int i=0;i<a.length;i++)
        {
            System.out.print(a[i]+"\t");
        }
    }

    private void show(Object...a)
    {
        for(int i=0;i<a.length;i++)
        {
            System.out.print(a[i]+"\t");
        }

        System.out.println("\nvarargs called");
    }

    public static void main(String... args)
    {
        int[]temp=new int[]{1,2,3,4};            

        Main main=new Main();
        main.show(temp);
        main.show();         //<-- This is possible.
    }
}

Это дляПо этой причине varargs в принципе не рекомендуется при перегрузке методов.


System.out.printf(); является примером varargs и определяется следующим образом.

public PrintStream printf(String format, Object ... args)
{
     return format(format, args);
}

format - Строка формата, как описано в синтаксисе строки формата

args - Аргументы, на которые ссылаются спецификаторы формата в строке формата.Если аргументов больше, чем спецификаторов формата, дополнительные аргументы игнорируются.Количество аргументов является переменным и может быть нулевым.Максимальное количество аргументов ограничено максимальным измерением массива Java, как определено в Спецификации виртуальной машины Java.Поведение нулевого аргумента зависит от преобразования.

1 голос
/ 06 января 2012

Да, это то же самое.

Вы можете прочитать эту статью:

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

1 голос
/ 06 января 2012

String... aaa все равно что иметь String[] aaa.

Я предполагаю, что точка с запятой после второй функции является опечаткой ...

0 голосов
/ 15 сентября 2015

при вызове метода он не заботится о типе возвращаемого значения, он учитывает имя метода, количество параметров и тип параметров, а также порядок параметров. Здесь вы указываете метод с тем же именем и теми же параметрами .bcoz в случае var arg, если мы вызываем метод с 2 параметрами, будет выполнен тот же метод, если мы вызываем метод с 3 параметрами, он будет вызывать один и тот же метод. здесь, если мы вызовем что-то (String [] a) и что-то (String ... aaa), будет вызван один и тот же метод .bcoz, мы можем заменить массив на var-arg, тогда возникнет путаница, который должен вызываться методом. тогда произойдет неоднозначность метода. вот почему он показывает дубликат метода.

здесь, если мы передадим массив методу параметра var - arg, он будет выполнен. Внутренне он преобразует переменные в одномерный массив.

...