Отличаться с какими параметрами он назвался в метод, у которого есть изменчивые аргументы

Я определил метод с изменчивыми аргументами:

public void ejemplo(String... nombres) {
    for (String unNombre : nombres) {
        System.out.println(unNombre);
    }
}

И тогда я могу называть это этих двух форм:

ejemplo("Ana", "Clara", "María");
ejemplo(new String[]{"Ana", "Clara", "María"});

И меня отпустило любопытство: У меня есть способ знать, назвался ли он в метод с многообразными аргументами или с array?

1
задан 10.01.2017, 00:43
0 ответов

Нет, нет способа определять которой формы он был так называемым. Разум - что, когда составитель находит это решение:

ejemplo("Ana", "Clara", "María");

... автоматически он меняет ее во вторую форму:

ejemplo(new String[]{"Ana", "Clara", "María"});

... так что во время выполнения, вызовы идентичны.


Снабди ссылками: JLS - Секция 15.12.4.2. Оцени тебе Arguments:

If m is being invoked with k ≠ n настоящий argument expressions, or, if m is being invoked with k = n настоящий argument expressions and the type of the k'th argument expression is not assignment совместимый with T[], then the argument list (e1, ..., en-1, en, ..., ek) is evaluated эксперт if it were written схвати (e1, ..., en-1, new |T[]| { en, ..., ek }), where |T[]| обозначь the erasure (§4.6) of T[].


Добавочное доказательство

Если ты используешь следующую программу minimalista:

public class VarargsTest {

    public static void main(String[] args) {
        ejemplo("Ana", "Clara", "María");
        ejemplo(new String[]{"Ana", "Clara", "María"});
    }

    private static void ejemplo(String... nombres) {
        for (String nombre : nombres) {
            System.out.println(nombre);
        }
    }
}

... и потом ты инспектируешь байт codes произведенные составителем:

D:\java\JavaApplication1\build\classes>"c:\Program Files\Java\jdk1.8.0_45\bin\javap" -c VarargsTest
Compiled from "VarargsTest.java"
public class VarargsTest {
  public VarargsTest();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return

  public static void main(java.lang.String[]);
    Code:
       0: iconst_3
       1: anewarray     #2                  // class java/lang/String
       4: dup
       5: iconst_0
       6: ldc           #3                  // String Ana
       8: aastore
       9: dup
      10: iconst_1
      11: ldc           #4                  // String Clara
      13: aastore
      14: dup
      15: iconst_2
      16: ldc           #5                  // String Marφa
      18: aastore
      19: invokestatic  #6                  // Method ejemplo:([Ljava/lang/String;)V
      22: iconst_3
      23: anewarray     #2                  // class java/lang/String
      26: dup
      27: iconst_0
      28: ldc           #3                  // String Ana
      30: aastore
      31: dup
      32: iconst_1
      33: ldc           #4                  // String Clara
      35: aastore
      36: dup
      37: iconst_2
      38: ldc           #5                  // String Marφa
      40: aastore
      41: invokestatic  #6                  // Method ejemplo:([Ljava/lang/String;)V
      44: return
}

Ты заметишь, что решение ejemplo("Ana", "Clara", "María"); соответствует линиям 0 19.

И решение ejemplo(new String[]{"Ana", "Clara", "María"}); соответствует линиям 22 41.

Если ты сравнишь их, ты увидишь, что нет никакого различия.

4
ответ дан 03.12.2019, 17:48
  • 1
    Ясно. Всегда хорошо ждать. Aproveché чтобы добавлять informació n добавочный, что я pareció интересный. –  09.01.2017, 16:09
  • 2
    Превосходно документируемый. И останься ясным, что в 1: anewarray ( " в new array" ) está производя новый array. –  10.01.2017, 00:34