Я пытался понять правила перегрузки java. Все кажется прекрасным, кроме следующих,
public static void main(String[] args) {
long aLong = 123L;
foo(aLong);
}
private static void foo(double aDouble) {
System.out.println("Foo aDouble");
}
private static void foo(Long aWrapperLong) {
System.out.println("Foo Wrapper Long");
}
private static void foo(int anInt) {
System.out.println("Foo Int");
}
private static void foo(float aFloat) {
System.out.println("Foo Float");
}
Почему вызов разрешен для foo(float aFloat)
. Я понимаю следующее из JLS:
Этот шаг использует имя метода и типы аргумента выражения для поиска методов, которые доступны и применимы Может быть более одного такого метода, и в этом случае выбран конкретный вариант.
Я намеренно использовал Wrapper Long здесь, а не примитивный. Примитивный длинный 64-битный размер не заканчивается в foo(double aDouble)
, а 32-битный float foo(float aFloat)
.
Вопрос Почему Java неявно (без приведения) конвертирует` long` в `float`?, далее разъясняет ответ на этот вопрос.