Подтвердить что ты не робот

Почему я получаю предупреждение о компиляции здесь (вызов метода var args в Java)

Источник:

public class TestVarArgs {
  public void varArgsMethod(Object ... arr) {
     System.out.println(arr.getClass().getName());
     for(Object o : arr) {
       System.out.println(o);
     }
  }

  public static void main(String[] args) {
    TestVarArgs tva = new TestVarArgs();
    tva.varArgsMethod(args);    
  }
}

Compile:

javac TestVarArgs.java 

Ошибка:

TestVarArgs.java:15: warning: non-varargs call of varargs method with inexact argument type for last parameter;
cast to java.lang.Object for a varargs call
cast to java.lang.Object[] for a non-varargs call and to suppress this warning    
tva.varArgsMethod(args);     
^

1 warning

Я использую javac 1.6.0_20, а код o/p указывает, что в любом случае был выполнен вызов non var arg.

4b9b3361

Ответ 1

Это потому, что String[] и Object... точно не совпадают.

Вы должны указать String[] либо Object[] (если вы хотите передать строки как отдельные параметры) или Object (если вы хотите только один аргумент, являющийся массивом).

 tva.varArgsMethod((Object[])args);    // you probably want that

 tva.varArgsMethod( (Object) args);    // you probably don't want that, but who knows?

Почему это предупреждение, а не ошибка? Обратная совместимость. Перед введением varargs вы использовали эти методы Object[] и скомпилированный код, который должен работать таким же образом после того, как метод был обновлен для использования varargs. Стандартная библиотека JDK полна подобных случаев. Например, java.util.Arrays.asList(Object[]) изменился на java.util.Arrays.asList(Object...) в Java5, и весь старый код, который его использует, должен компилироваться и работать без изменений.

Ответ 2

Аргумент типа String[] должен быть явно передан в Object[] для вызова метода varargs varArgsMethod(Object...) из типа TestVarArgs. В противном случае он может быть передан объекту для вызова varargs. Вы можете исправить это, сделав один из способов Если вы отбрасываете String[] на Object[] (ref: tva.varArgsMethod((Object[])args);)
ИЛИ
измените параметр метода на String[]
(Ссылка: public void varArgsMethod(String ... paramArr))

Ответ 3

Измените метод как

public void varArgsMethod(String ... arr)

Ответ 4

Один из элегантных способов избавиться от этого предупреждения: вместо tva.varArgsMethod(args) вызов tva.varArgsMethod(Arrays.stream(args).toArray()) явно показывающий, что вы передаете несколько аргументов.