Nowa funkcja dostępna w JDK 8 umożliwia dodawanie do istniejącego interfejsu przy zachowaniu zgodności binarnej.
Składnia jest podobna do
public interface SomeInterface() {
void existingInterface();
void newInterface() default SomeClass.defaultImplementation;
}
W ten sposób w przypadku wszystkich istniejących implementacji, SomeInterfacegdy aktualizują się do nowej wersji, nie wszystkie nagle mają błędy kompilacji newInterface().
Chociaż jest to fajne, co się dzieje, gdy wdrażasz dwa interfejsy, które dodały nową domyślną metodę, której nie zaimplementowałeś? Pozwólcie, że wyjaśnię na przykładzie.
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();
Czy zostało to już zdefiniowane jako część JDK 8?
Znalazłem bogów Jawy, którzy mówią tutaj o czymś podobnym http://cs.oswego.edu/pipermail/lambda-lib/2011-Feb February/000068.html , ale jest to część prywatnej listy mailingowej i nie mogę ich bezpośrednio zapytać.
Zobacz to, aby uzyskać więcej informacji o tym, jak wartości domyślne będą używane w JDK 8 i rozszerzaniu interfejsu Collection o obsługę lambd: https://oracleus.wingateweb.com/published/oracleus2011/sessions/25066/25066_Cho223662.pdf