Нова функція 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