Странное поведение при перегрузке метода varargs - PullRequest
0 голосов
/ 13 декабря 2018

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

public class Main{
 public static void main(String[] args){
  print(1);
  print(1,2);
  print(new String[]{"a","b"});
  print(new String[][]{{"a","b"},{"c","d"}});
 }

 public static void print(Object object){
  System.out.println("single argument method");
  System.out.println(object);
 }

 public static void print(Object object0,Object object1){
  System.out.println("two argument method");
  System.out.println(object0);
  System.out.println(object1);
 }

 public static void print(Object... objects){
  System.out.println("varargs method with "+objects.length+" arguments");
  for(Object object : objects){
   System.out.println(object);
  }
 }
}

Вывод:

single argument method
1
two argument method
1
2
varargs method with 2 arguments
a
b
varargs method with 2 arguments
[Ljava.lang.String;@5e2de80c
[Ljava.lang.String;@1d44bcfa

Третья строка main вызывает метод с одним аргументом, а именно String [] с двумя элементами,Но он не выполняет метод с одним аргументом, а выполняет метод varargs и действует так, как если бы я дал ему два аргумента (это нормально, так как это массив).

Теперь вопрос: Должно ли это случиться?Я нашел ошибку или недокументированное поведение?Есть ли причина, почему он это делает?

Почему я делаю это: я хочу создать ярлык для печати на консоль, который может принимать как произвольное количество аргументов (длянесколько строк), а также хорошо печатать массивы и списки.

1 Ответ

0 голосов
/ 13 декабря 2018

Должно ли это случиться?

Да

Нашел ли я ошибку или недокументированное поведение?

Нет

Есть ли причина, по которой он это делает?

Да. Из Oracle :

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

Когда вы явно используете массив, он все равно соответствует сигнатуре varargs.Это было сделано для того, чтобы люди могли легко переключать параметр массива в переменные без нарушения существующих точек интеграции.

Это точно та же причина, по которой main может быть String[] или String...

.
...