Ответ 1
раздел разрешения перегрузки в JLS объясняет, почему:
- Первая фаза (§15.12.2.2) выполняет разрешение перегрузки без разрешения преобразования бокса или unboxing или использования метода переменной arity призывание. Если на этом этапе не обнаружен какой-либо применимый метод, обработка продолжается до второй фазы.
Это гарантирует, что любые вызовы, которые были действительны на языке программирования Java до Java SE 5.0, не считаются двусмысленными в результате внедрения методов переменной arity, неявного бокса и/или распаковки. Однако объявление метода переменной arity (§8.4.1) может изменить метод, выбранный для выражения вызова метода данного метода, поскольку метод переменной arity рассматривается как метод фиксированной arity в первой фазе. Например, объявление
m(Object...)
в классе, который уже объявляетm(Object)
, вызываетm(Object)
больше не выбирается для некоторых выражений вызова (например,m(null))
, аm(Object[])
более конкретно.
- Вторая фаза (§15.12.2.3) выполняет разрешение перегрузки при разрешении бокса и распаковки, но все же исключает использование вызова метода переменной arity. Если на этом этапе не обнаружен какой-либо применимый метод, обработка продолжается до третьей фазы.
В первой фазе компилятор не включает метод go(Short n)
в своем разрешении. Вместо этого он считает go(int n)
применимым методом. Этот метод применим, поскольку расширение short
преобразуется в int
.