Новая функция, появившаяся в 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-Feb February/ 000068.html , но это часть частного списка рассылки, и я не могу спросить их напрямую.
См. Здесь для получения дополнительных сведений о том, как будут использоваться значения по умолчанию в JDK 8 и о расширении интерфейса Collection для поддержки лямбда-выражений: https://oracleus.wingateweb.com/published/oracleus2011/ sessions / 25066 / 25066_Cho223662.pdf