Java имеет A , она называется single dispatch :
- перегрузка метода выбирается компилятором во время компиляции (соответствуеттип времени компиляции
right
для методов, предлагаемых типом времени компиляции left
) - вызов метода происходит для типа времени выполнения
left
- поскольку методы не исчезают, left
безусловно, есть метод с той же сигнатурой, которая была выбрана во время компиляции.Это действие считается «рассылкой», и поскольку оно зависит только от left
(во время выполнения), оно «одиночное».
Супер простая демонстрация с использованием встроенных println(Object)
и println(char[])
:
char c[]={'a','b','c'};
System.out.println(c);
Object o=c;
System.out.println(o);
Это приводит к примерно как
abc
[C@1540e19d
Первая строка показывает, что println(char[])
объединяет массив символоввторая строка показывает, что точно такой же массив (можно добавить некоторую проверку, такую как println(o==c);
), переданную как Object
во время компиляции, приводит к вызову перегрузки println(Object)
, независимо от типа среды выполнения.
B и C , вероятно, не существуют.
D вызывается многократная отправка , когда сигнатура методатакже выбирается во время выполнения с использованием фактического типа времени выполнения аргументов, и выбранный метод вызывается для типа времени выполнения left
.Java не поддерживает это по умолчанию, это может быть реализовано с использованием отражения, вот пример с одним аргументом:
public static void trickyprintln(Object o) throws Exception {
System.out.getClass().getMethod("println",o.getClass()).invoke(System.out,o);
}
public static void main (String[] args) throws Exception {
char c[]={'a','b','c'};
trickyprintln(c);
Object o=c;
trickyprintln(o);
}
Этот результат в
abc
abc
, поскольку println
выбирается вручную, используя тип аргумента во время выполнения.Так что это можно сделать, если кому-то это действительно нужно в Java, но это не происходит автоматически.