Método Java sobrecargado con Vararg

Tengo dos versiones de addValues, una con parámetros vararg.

double addValues(double ... values) {
    double result = 0d;
    for (double value : values)
        result += value;
    return result;
}

double addValues(double v1, double v2) {
    return v1 + v2;
}

Cuando llamo, addValues(2, 3)lo que me parece ambiguo, por qué Java selecciona eladdValues(double v1, double v2) versión para ejecutar el código? ¿Cómo determina Java qué versión está 'más cerca' de la invocación?

Gracias.

Respuesta 1

Esta respuesta proporciona la sección relevante de la Especificación del lenguaje Java. Sin embargo, es tan complicado que requiere algunos ejemplos para explicar.

El compilador siempre elegirá un método que no necesite "invocación de aridad variable" o auto boxing o auto unboxing si es posible. La invocación de aridad variable es cuando se invoca un método varargs pasando una lista de parámetros para el último argumento (en lugar de una matriz).

Por ejemplo, suponga que tiene un método con firma

void foo(int... arr)

Esta es una invocación de aridad variable ...

foo(1, 2, 3);

... pero esto no es así.

foo(new int[] {1, 2, 3});

Entonces, en su caso, addValues(2, 3)usa la segunda versión, ya que esta no es una invocación de aridad variable.

No es cierto decir que el compilador siempre favorecerá un método que no involucre varargs sobre uno que sí involucre varargs, como muestra este ejemplo:

public static void bar(int... a) {
    System.out.println("Varargs");
}

public static void bar(Object a) {
    System.out.println("Object");
}

public static void main(String[] args) {
    bar(new int[] {1, 2, 3});    // Prints Varargs
} 

En este ejemplo, ninguna opción es una invocación de aridad variable, pero la primera versión se invoca ya que es más específica.

Estas reglas hicieron posible cambiar una firma no varargs

baz(int[] arr)

a un varargs uno

baz(int... arr)

sin cambiar el comportamiento de ningún programa existente.

Respuesta: 2

Terminé mi aplicación de cuestionario hace unos días. Ahora, quiero publicar un segundo cuestionario con diferentes preguntas. Copié el proyecto en Eclipse y cambié las preguntas. Ahora, cuando lo instale en mi ...

Estoy buscando la mejor manera de almacenar el stacktrace (obtenido a través de Thread.dumpStack ()) y el rastreo de excepción en la base de datos. Estoy desarrollando una aplicación que hace el rendimiento de la aplicación. Traza el método ...

Recientemente comencé a tomar un curso de Ciencias de la Computación para entender más la programación y parece haber tocado un obstáculo con nuestro laboratorio en ArrayLists. El propósito del programa es poner x cantidad de ...

Comencé a usar Hadoop recientemente y luché por darle sentido a algunas cosas. Aquí hay un ejemplo básico de WordCount que estoy viendo (cuente la cantidad de veces que aparece cada palabra): Mapa (String docid, ...