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, SomeInterface
gdy 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