Pytanie z książki:Java 8 - domyślne metody - obaw o starszych kod
w przeszłości (pre-Java 8), to powiedziano nam, że jest to zła forma dodać metody do interfejsu ponieważ złamie istniejący kod. Teraz powiedziano ci, że możesz dodawać nowe metody, pod warunkiem, że dostarczysz domyślną implementację.
- Jak to jest bezpieczne? Opisz scenariusz, w którym nowa metoda
stream
interfejsuCollection
powoduje kompilację starszego kodu.- Co ze zgodnością binarną? Będzie dziedzictwo kod z pliku JAR nadal działać?”
moje odpowiedzi są następujące, ale nie jestem pewien, o nich.
- Jest bezpieczny tylko wtedy, gdy kod starszego typu nie przewiduje metodę o tej samej nazwie
stream
i tym samym podpisem (np. w starszej klasie, która implementujeCollection
) W przeciwnym razie ten stary kod starszego oprogramowania nie powiedzie się kompilacji - Myślę, że zgodność binarna jest zachowana, stary kod ze starego pliku JAR nadal będzie działał Ale nie mam żadnych wyraźnych argumentów na ten temat s.
Czy ktoś mógłby potwierdzić lub odrzucić te odpowiedzi, lub po prostu dodać więcej argumentów, odniesień lub jasności do tych odpowiedzi?
[Powiązane] (http://stackoverflow.com/a/22618640/335858). – dasblinkenlight
Postępowanie z zachowaniem zgodności binarnej było główną motywacją dodawania domyślnych metod do języka.Dodanie wartości domyślnej do istniejącej metody jest zgodne z binariami i źródłami; dodanie nowej metody z domyślną jest zgodna z binariami i źródłami (interakcje modulo ze sposobami zderzeń w podklasach - ma to identyczną charakterystykę kompatybilności co dodanie nowej metody do klasy nieostatecznej). –
Podczas gdy kompatybilność binarna jest zachowywana, może nadal pojawiają się problemy, gdy wchodzą w interakcję z zachowaniem biblioteki JRE, jak w [tym scenariuszu] (http://stackoverflow.com/q/26816650/2711488). Możesz także wziąć pod uwagę, że metoda może mieć zgodny * podpis *, dlatego zaczyna zastępować nową 'domyślną' metodę bez zamiaru jej ... – Holger