Java co prawda zaczyna mieć niektóre feature'y dodane kilkanaście lat temu do innych języków, ale w rzeczywistości znaczna część kodu tkwi na starych wersjach 8 czy 11 więc programiści javy dopiero za jakieś 20 lat będą mogli się pobawić "nowinkami" języka. Mimo że niby java stawia na wsteczną kompatybilność to z tego co widziałem praktycznie każdy projekt ma istotne problemy z podniesiem wersji.
z której na którą? java 9 dużo zmieniła w bebechach (tych nieustandaryzowanych, nieudokumentowanych oficjalnie szczegółach implementacyjnych nieprzeznaczonych do bezpośredniego użycia) i dlatego frameworki, które grzebią w tych bebechach mogą wymagać konkretnie javy 8. w pozostałych przypadkach, tzn. przesiadki z wersji x na y, gdzie zarówno x jak i y są >= 9, wielkich problemów nie powinno być.
gdyby javowe frameworki nie grzebały w bebechach nieprzeznaczonych do grzebania, tylko używały standardowego api, to problemu z upgrade'm javy by nie było. rzeczywistość jednak jest jaka jest. stąd java zmierza powoli w kierunku ograniczenia takich praktyk: https://openjdk.org/jeps/8305968 JEP draft: Integrity by Default.
innym problemem jest dynamiczna analiza i generowanie bajtkodu. ten czasem zmienia się z wersji na wersję i java nie daje tutaj oczywiście żadnych gwarancji kompatybilności wprzód, tzn. że stara biblioteka obsłuży nowy bajtkod. stąd potrzeba wbudowania w javę mechanizmów typu https://openjdk.org/jeps/457 JEP 457: Class-File API (Preview). z takim mechanizmem będzie łatwiej tworzyć frameworki, które nie powstrzymują przed upgradem javy, a jednocześnie dalej obrabiają bajtkod.
java 8 ma komercyjne wsparcie gdzieś około do końca 2030 roku, więc to 'odblokuje' ekosystem javy przed tym terminem, tzn. współczesny nacisk na aktualizacje bezpieczeństwa raczej wyeliminuje biblioteki uczepione porzuconej wersji javy.
tak czy siak, java idzie w kierunku coraz szybszego i sprawniejszego podnoszenia wersji, a ostatnim momentem, gdzie przejście na nową wersję było bardzo problematyczne, jest przejście z javy 8 na javę 9.