Тройные точки (varargs) являются решающим аспектом здесь. Без них версия Object
просто побеждает. Однако, с varargs, это неоднозначно, даже если вместо этого вы «обновите» вариант Object...
до Double...
. ecj соглашается, что обычно означает, что они оба следуют spe c.
И так оно и есть; соответствующий раздел - это все 3 бита от JLS с 15.12.2.2 по JLS 15.12.2.4 .
В то время как существует «строгое», а затем «свободное» приложение, поэтому версия Object выигрывает без varargs, как только вы погружаетесь на третий уровень (переменная arity - это JLS-ese для 'varargs', эти тройные точки), такого разделения не существует, поэтому оба эти метода "подходят" на уровне 15.12.2.4. , И поэтому, это неоднозначно.
Хех, пока экспериментировал, я обнаружил ошибку java. Этот код:
public class Test {
public static void main(String[] args) {
double d = 5.0;
test(d);
}
public void test(Double d) { System.out.println("D"); }
public void test(double d) { System.out.println("d"); }
не компилируется, вызывая ошибку «ссылка на тест неоднозначна». Эта ошибка вдвойне ошибочна. Он не выделяет фактическую ошибку в этом коде (то есть, что методы тестирования являются методами экземпляра, они не могут быть вызваны из контекста stati c), и указывает на то, что этот вызов неоднозначен, а это не так; сделать методы тестирования stati c и код скомпилируется; победит вариант в нижнем регистре-d.
Как и ожидалось, ecj (компилятор eclipse) не страдает от этой ошибки и выдает правильную ошибку. Это имеет тенденцию быть лучше при следующих показателях c, чем javac.