Этот вопрос уже имеет ответы здесь :
Закрытый 9 лет назад .
Возможный дубликат: Этот допустимый Java?
Я был удивлен обнаружить класс Java ниже компиляций. Это имеет несколько методов, с тем же именем, количеством аргументов и после типов стирания типа аргумента. Все же это компилирует и работает как ожидалось на окнах с помощью различных версий компилятора Sun JDK 1.6. Таким образом, если это - ошибка, это было вокруг целую вечность....
Это также скомпилировало с многочисленными версиями Eclipse, но не делает компилятора с компилятором, который поставлется с Eclipse 3.6
Кроме того, работы кода вызова как ожидалось - т.е. нет никаких ошибок о ambigious методах на коде вызова.
Если Вы выполняете итерации по методам, возвращенным ErasureExample.class.getMethods (), они - весь подарок.....
Согласно JLS это было бы недопустимо, если методы имеют "эквивалентные переопределению" подписи - строго они не делают, поскольку ни один из Набора, Набора, ни Набора не переопределение, эквивалентное...., если это так, Eclipse является неправильным, корректный JDK...
Функция или ошибка? Это должно скомпилировать?
/**
* Demonstrates that a class with methods that differ only by return type can exist.
* Section 8.4 of the JLS suggests this is an error IFF the methods had
* override equivalent signatures, which they dont''
*
*
* From JLS 8.4...
* It is a compile-time error for the body of a class to declare as members two methods
* with override-equivalent signatures (§8.4.2) (name, number of parameters, and types
* of any parameters).
*
* Should it compile?
*/
public class ErasureExample {
// note the single Collection argument...
public static int[] asArray(Collection vals) {
if (vals == null)
return null;
int idx = 0;
int[] arr = new int[vals.size()];
for (Integer i : vals) {
arr[idx] = i==null? 0 : i.intValue();
idx++;
}
return arr;
}
// same method name as above, type differs only by generics.... surely this violates 8.4 of JLS...
public static long[] asArray(Collection vals) {
if (vals == null)
return null;
int idx = 0;
long[] arr = new long[vals.size()];
for (Long i : vals) {
arr[idx] = i==null? 0 : i.longValue();
idx++;
}
return arr;
}
// same method name as above, type differs only by generics.... surely this violates 8.4 of JLS...
public static boolean[] asArray(Collection vals) {
if (vals == null)
return null;
int idx = 0;
boolean[] arr = new boolean[vals.size()];
for (Boolean b : vals) {
arr[idx] = b==null? false : b.booleanValue();
idx++;
}
return arr;
}
}