Следующий код не компилируется.
package varargspkg;
public class Main {
public static void test(int... i) {
for (int t = 0; t < i.length; t++) {
System.out.println(i[t]);
}
System.out.println("int");
}
public static void test(float... f) {
for (int t = 0; t < f.length; t++) {
System.out.println(f[t]);
}
System.out.println("float");
}
public static void main(String[] args) {
test(1, 2); //Compilation error here quoted as follows.
}
}
Выдается ошибка времени компиляции.
ссылка на тест неоднозначна, оба метода test (int...) в varargspkg.Main и метод test (float...) в varargspkg.Main match
Кажется очевидным, потому что значения параметров в вызове метода test(1, 2);
можно повысить до int
, а также float
Если кто-либо или оба параметра имеют суффикс F
или F
, он компилируется.
Если мы, однако, представляем принимающие параметры в сигнатуре метода с соответствующими типами обертки следующим образом
public static void test(Integer... i) {
System.out.println("Integer" + Arrays.asList(i));
}
public static void test(Float... f) {
System.out.println("Float" + Arrays.asList(f));
}
то вызов метода test(1, 2);
не вызывает ошибок компиляции. Метод, который должен быть вызван в этом случае, тот, который принимает один параметр Integer
varargs (первый в предыдущем фрагменте).
Почему в этом случае ошибка, как в первом случае, не сообщается? По-видимому, здесь применяются автоматическое боксирование и автоматическое продвижение по типу. Сначала применяется автоматический бокс, чтобы разрешить ошибку?
В документах Oracle говорится:
Вообще говоря, вы не должны перегружать метод varargs, или он будет сложно программистам понять, какая перегрузка называется.
Последнее предложение в этой ссылке. Это, однако, для лучшего понимания varargs.
Также добавить ниже код компилируется просто отлично.
public class OverLoading {
public static void main(String[] args) {
load(1);
}
public static void load(int i) {
System.out.println("int");
}
public static void load(float i) {
System.out.println("float");
}
}
EDIT:
Ниже приведена snap shot, которая указывает на ошибку компиляции. Я создал новое приложение, поэтому имя пакета отличается.
Я использую JDK 6.