Методи за замовчуванням вимагають таких змін у байт-коді та JVM, що їх було б неможливо зробити на Java 7. Перевірявач байт-коду Java 7 і нижче буде відхиляти інтерфейси з органами методів (за винятком статичного методу ініціалізатора). Спроба емуляції методів за замовчуванням статичними методами на стороні виклику не дала б однакових результатів, оскільки методи за замовчуванням можуть бути замінені в підкласах. Retrolambda має обмежену підтримку методів підтримки за замовчуванням, але він ніколи не може бути повністю підтримуваний, оскільки він справді вимагає нових функцій JVM.
Lambdas міг би працювати на Java 7 як є, якщо потрібні класи API просто існували б там. Викликана динамічна інструкція існує на Java 7, але можна було б реалізувати лямбдати так, щоб вона генерувала класи лямбда в час компіляції (ранні JDK 8 побудови робили це так), і в цьому випадку вона буде працювати в будь-якій версії Java. (Oracle вирішив використати інкекединаміку для лямбда для подальшої перевірки; можливо, одного дня JVM матиме функції першого класу, тож виклик динаміки можна буде змінити, щоб використовувати їх замість того, щоб генерувати клас для кожної лямбда, покращуючи тим самим продуктивність.) Що робить Retrolambda - це що він обробляє всі ці викликані динамічні інструкції та замінює їх анонімними класами; те саме, що робить Java 8 під час виконання, коли lamdba, що викликає динаміку, називається вперше.
Повторення анотацій - це лише синтаксичний цукор. Вони є байт-кодом, сумісним з попередніми версіями. У Java 7 вам просто потрібно реалізувати собі допоміжні методи (наприклад, getAnnotationsByType ), які приховують деталі реалізації анотації на контейнері, яка містить повторні анотації.
AFAIK, анотації типів існують лише під час компіляції, тому вони не потребують змін байтового коду, тому просто зміни кількості версій байт-коду класів, складених Java 8, повинно бути достатньо, щоб вони працювали на Java 7.
Імена параметрів методів існують у байт-коді з Java 7, тому це також сумісно. Ви можете отримати доступ до них, прочитавши байт-код методу та переглянувши імена локальних змінних у інформації про налагодження методу. Наприклад, Spring Framework робить саме це для реалізації @PathVariable , тому, ймовірно, існує метод бібліотеки, який ви могли б викликати. Оскільки в абстрактних методах інтерфейсу немає методу, то інформація про налагодження не існує для методів інтерфейсу на Java 7, а AFAIK ні на Java 8.
Інші нові функції - це переважно нові API, вдосконалення HotSpot та інструментарій. Деякі нові API доступні як бібліотеки сторонніх виробників (наприклад, ThreeTen-Backport та streamsupport ).
Підсумкові підсумки, методи за замовчуванням вимагають нових функцій JVM, але інші мови не мають. Якщо ви хочете використовувати їх, вам потрібно компілювати код в Java 8 , а потім перетворити байт - код з Retrolambda в форматі Java 5/6/7. Як мінімум, потрібно змінити версію байт-коду, і javac забороняється, -source 1.8 -target 1.7
тому потрібен ретротранслятор.