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