Новая функция, входящая в JDK 8, позволяет добавлять к существующему интерфейсу при сохранении двоичной совместимости.
Синтаксис похож на
public interface SomeInterface() {
void existingInterface();
void newInterface() default SomeClass.defaultImplementation;
}
Таким образом, для всех существующих реализаций SomeInterface
при обновлении до этой новой версии они не все вдруг компилируют ошибки вокруг newInterface()
.
В то время как это аккуратно, что происходит, когда вы реализуете два интерфейса, которые оба добавили новый метод по умолчанию, который вы не реализовали? Позвольте мне объяснить на примере.
public interface Attendance {
boolean present() default DefaultAttendance.present;
}
public interface Timeline {
boolean present() default DefaultTimeline.present;
}
public class TimeTravelingStudent implements Attendance, Timeline {
}
// which code gets called?
new TimeTravelingStudent().present();
Было ли это определено как часть JDK 8?
Я нашел богов Java, говорящих о чем-то подобном здесь http://cs.oswego.edu/pipermail/lambda-lib/2011-February/000068.html, но его часть личного списка рассылки, и я не могу напрямую их просить.
Подробнее об использовании по умолчанию в JDK 8 и расширении интерфейса Collection для поддержки lambdas см. в этом разделе. https://oracleus.wingateweb.com/published/oracleus2011/sessions/25066/25066_Cho223662.pdf