То, что вы видите здесь, называется методом моста.
Чтобы понять, зачем это нужно, мы должны посмотреть, как JVM определяет, отличаются ли два метода:
- У каждого метода есть имя.Другое имя -> другой метод.
- У каждого метода есть дескриптор.Другой дескриптор-> другой метод.
Дескриптор содержит все аргументы и тип возвращаемого значения (с обобщениями это стирание).
С точки зрения JVM Flow doSomething()
- это другой методчем Publisher doSomething()
, поэтому, когда его просят сделать вызов invokeinterface для Publisher doSomething()
, он не будет вызывать Flow doSomething()
.
Это может произойти, если цель на месте вызова имеет тип interfaceA
:
intefaceA foo = ...;
foo.doSomething();
Но с точки зрения языка оба метода одинаковы, и один переопределяет другой.
Чтобы восстановить это отношение, javac
добавляет метод моста с исходным типом метода.это просто вызывает перегруженный метод.