Рассмотрим следующий пример кода:
public class TestClass {
public void doSth(String str, String l, Object... objects) {
System.out.println("A");
}
public void doSth(String str, Object... objects) {
System.out.println("B");
}
}
Когда я теперь звоню new TestClass().doSth("foo", "bar")
, я получаю ожидаемый результат A
. Но если я изменил сигнатуру метода первого метода, отвечая параметру l
на примитивный тип:
public class TestClass {
public void doSth(String str, long l, Object... objects) {
System.out.println("A");
}
public void doSth(String str, Object... objects) {
System.out.println("B");
}
}
вызов new TestClass().doSth("foo", 2L)
приведет к ошибке времени компиляции reference to call ambiguous
.
Я подумал об этом один в течение некоторого времени, а также проконсультировался с qaru.site/info/237063/..., но я не смог понять, почему это происходит. По-моему, doSth("foo", 2L)
более специфичен для подписи doSth(String string, long l, Object... obj)
и должен позволить компилятору также прийти к такому выводу.