2012-01-06 16 views
7
class WrongOverloading{ 
    void something(String [] a){ .. } 
    Integer something(String... aaa){ return 1;} 
} 

¡El código anterior no se compila! El compilador dice que estos son métodos duplicados. Entonces, ¿usar String Array o String var-args significa exactamente lo mismo?Son String [] y String ... (Var-args) igual cuando funcionan internamente?

¿Cómo se implementan internamente?

+0

¿Por qué tiene el punto y coma al final de la función? – Ankit

Respuesta

6

Son efectivamente el mismo, excepto que el compilador no aceptará un varargs a menos que su último argumento y no le permitirá pasar múltiples argumentos a una matriz.

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 
1

String... aaa es como tener String[] aaa.

Estoy asumiendo que el punto y coma después de la segunda función es un error tipográfico ...

1

Sí, es el mismo.

Usted puede leer this artículo:

Todavía es cierto que varios argumentos deben ser pasados ​​en una matriz, pero los varargs cuentan automatiza y oculta el proceso.

1

El atributo [vararg] especifica que el método toma un número variable de parámetros. Para lograr esto, el último parámetro debe ser una matriz segura de tipo Variant que contiene todos los parámetros restantes:

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

La sintaxis varargs básicamente permite especificar que existen posibles parámetros, ¿verdad? Ellos pueden estar allí, o no pueden estar allí. Ese es el propósito de los tres puntos. Cuando llama al método, puede llamarlo con o sin esos parámetros. Esto se hizo para evitar tener que pasar matrices a los métodos.

Tener un vistazo a this:

Ver When do you use varargs in 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. 
    } 
} 

Es por esta razón, varargs básicamente no se recomienda en la sobrecarga de métodos.


System.out.printf(); es un ejemplo de varargs y definido como sigue.

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

formato - Una cadena de formato como se describe en la sintaxis de cadena de formato

args - argumentos que hacen referencia los especificadores de formato en la cadena de formato. Si hay más argumentos que especificadores de formato, los argumentos adicionales se ignoran. La cantidad de argumentos es variable y puede ser cero. El número máximo de argumentos está limitado por la dimensión máxima de una matriz de Java, tal como se define en la Especificación de máquina virtual de Java. El comportamiento en un argumento nulo depende de la conversión.

1

sí, son lo mismo porque cuando llamas al método con elipsis (String ...) convierte a String array.

4

De this SO discussion

El tipo subyacente de un método variadic function(Object... args) es function(Object[] args). Sun agregó varargs de esta manera para preservar la compatibilidad con versiones anteriores .

Por lo tanto, como todas las demás respuestas han dicho, sí, son lo mismo.

1

El compilador detrás de las escenas realmente convierte su método var args en un método con una entrada de matriz. Esta es la razón por la que puede tener un método var args sobrecargado con una matriz como entrada porque después de la compilación ambos serán idénticos.

0

mientras que llamar a un método que no le importa el tipo de retorno que tendrá en cuenta el nombre del método, el número de parámetros y tipo de parámetros y orden de los parámetros .Aquí está especificando un método con el mismo nombre mismos parámetros .bcoz en caso de var arg si llamamos al método con 2 parámetros, se ejecutará el mismo método, si llamamos al método con 3 parámetros llamará al mismo método. aquí, si llamamos algo (String [] a) y algo (String ... aaa), el mismo método se llamará .bcoz, podemos reemplazar array con var-arg, entonces surgirá una confusión a la que debería llamarse el método. entonces se producirá la ambigüedad del método. Es por eso que muestra un método duplicado.

aquí si pasamos la matriz al método del parámetro var - arg se ejecutará. Internamente convierte var - args en matriz unidimensional.

+1

No estoy seguro de si esto califica como respuesta o si describe un problema con el que acaba de toparse. – yvesmancera

+0

gracias yvesmancera – krishna

+0

he editado la respuesta – krishna

Cuestiones relacionadas