Java как язык: есть ли отличия между разработкой для Android и Java SE/EE (февраль 2015)?
Всем привет!
В рамках задачи научиться создавать приложения для Android задался вопросом освоить требуемый инструментарий, в первую очередь сам язык Java.
Прочитав вводную книжку по Java, ориентированную в первую очередь на использование Java SE, заметил, что язык активно развивается, и в нём постоянно появляются различные новые конструкции. Например, в Java 8 появились лямбды.
В связи с этим вопрос: именно как язык, то есть совокупность синтаксиса и грамматики, а также программных конструкций, ими описывающихся, является ли "каноничаская" Java от Oracle идентичной тому языку, на котором пишутся программы для Android? Условно говоря, все эти дженерики, лямбды и аннотации, доступны ли они Android-разработчикам в том же самом виде, что и "обычным" Java-программистам?
Отдельный вопрос - версионность языка. Насколько я понял, в "обычной" Java всё упирается в версию JVM, то есть при написании кода доступный синтаксис определяется той версией виртуальной машины, на которой он будет исполняться.
А что на Android? Всё упирается в версию ОС? Тогда, к примеру, если я создаю приложение, поддерживающее Android начиная с версии 2.1, то мне не только доступно лишь то API, которое существовало на тот момент, но и актуальный на тот момент синтаксис языка, то есть, в моём примере, без лямбд? Или же ограничения касаются лишь API, а компилятор автоматом генерит по новому исходному тексту байткод, который сможет понять даже старая версия Dalvik?
Буду благодарен всем, кто сумеет прояснить этот вопрос.
Вдохновившись предыдущими ответами и заметив некоторые несостыковки мнений у их авторов, отправился на собственные поиски. И вот что мне удалось найти.
Java от Oracle и язык разработки для Android - де-юре никак не связанные друг с другом вещи. Причина - опять же юридическая, связанная с вопросами лицензирования Java для стороннего использования.
Как следствие, язык и фреймворк для разработки под Android базируются на проекте Apache Harmony, опенсорсной реализации Java SE, причём на той его ветке, которая реализовывала Java 6.
Фичи канонической Java от Oracle появляются в языке разработки для Android спорадически и исключительно по желанию Google, то есть никак не связаны с версионностью Java от Oracle. Де-факто, при работе с Android KitKat и выше можно использовать большинство (хотя, я так понял, не все - к примеру, try-with-resources в пролёте) фишек Java 7.
Существующие способы использования новых фишек канонической Java при разработке под Android базируются на различных хитростях процедуры сборки. Например, для поддержки лямбд предлагается использовать нечто под названием gradle-retrolambda, что конвертирует байткод, получающийся при компиляции Java 8 кода, в байткод Java 6/7, после чего этот байткод конвертируется в формат JVM, используемой в Android. Судя по всему, иных фич Java 8, отличных от лямбд, данный метод не поддерживает.
Иной подход для использования новых возможностей Java при разработке под Android - это альтернативные языки, в частности, Kotlin (gadfi, спасибо за наводку ;)) - продукт компании JetBrains, на базе чьей IDEA нынче строится официальный инструментарий для разработки под Android.
Android не поддерживает java8, более того на самом android работает своя версия jvm ─ dalvik, а в android l art (в некоторых более ранних можно было выбирать на устройстве виртуальную машину, в l отказались от dalvik )
почти весь сахар для android не доступен, но если он очень нужен можете посмотреть в сторону kotlin
Верно последнее высказывание.
Все одинаково. Не важна версия языка. Разница между версиями android заключается в API. Для поддержки очень старыми версиями android современных возможностей используется Support Library.
Допустим, велась разработка на Java 6. Потом пришло обновление до Java 8. Вы переписываете код на Java 8 (оптимизируя только функции и работу Java, а не Android) и все отлично работает.
То есть как язык является именно "каноническим" от Oracle. Но Android, кажется, работает только с Java 6. (поправьте в комментариях, если не так).
В структуре он имеет сходство с Java EE (можете это сразу заметить), но это структура Android-проекта.
Поясните, пожалуйста, фразу "Android работает только с Java 6". Если само приложение можно писать с использованием Java 8, то какая мне как разработчику разница, с чем там работает сам Android? Или вы имеете в виду, что в предоставляемых Android API, даже последних версий, нет ничего, использующего фишки Java 7 и выше?