Почему я получаю предупреждение о компиляции здесь (вызов метода 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.
Ответы
Ответ 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())
явно показывающий, что вы передаете несколько аргументов.