Новая функция, появившаяся в 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 для поддержки лямбд:
https://oracleus.wingateweb.com/published/oracleus2011/sessions/25066/25066_Cho223662.pdf