Ссылка на метод требует уровня API 22 - PullRequest
0 голосов
/ 31 декабря 2018

На основе Использование возможностей языка Java 8 ссылки на методы совместимы с любой minSdkVersion , тогда почему Для ссылки на метод требуется уровень API 22 * ​​1006 *?

В настоящее время я использую Android Studio 3.2.1 с com.android.tools.build:gradle:3.2.1 и JDK 1.8, в build-gradle У меня есть:

android {
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

Пример

public class SimpleBundleEntry<V> extends BundleEntry<V> {

    public SimpleBundleEntry(String key, V value, 
                            BundleWriter<V> writer, BundleReader<V> reader) 
    {/*init*/}

    // ...

    public interface BundleReader<V> {
        V readValue(Bundle bundle, String key);
    }

    public interface BundleWriter<V> {
        void writeValue(Bundle bundle, String key, V value);
    }
}

Код проблемы

public static BundleEntry<Boolean> ofBoolean(String key, Boolean value) {
    return new SimpleBundleEntry<>(key, value,
            Bundle::putBoolean, // <------------------- PROBLEM HERE
            (bundle, k) -> bundle.getBoolean(k));
}

Ответы [ 2 ]

0 голосов
/ 31 декабря 2018

Ссылка: Лямбда-выражения

Поддерживаемые языковые функции Java 8

Поддержка Android языка Java 8:не завершено на момент написания поста.Однако все основные функции поддерживаются, и некоторые из них (например, лямбда-выражения) также переносятся на уровень API 23 и ниже .

Вот список поддерживаемых функций:

  • Лямбда-выражения (также для API <= 23) </p>

  • Ссылки на методы (также для API <= 23) </p>

  • Типовые аннотации (также для API <= 23) </p>

  • По умолчанию иметоды статического интерфейса

  • Повторяющиеся аннотации

Помимо перечисленных, стоит отметить, что Stream API также поддерживается, а также некоторые другие функции (полный список см. в официальной документации).

Окружите код, который требует API 22 или букву

//if(Build.VERSION.SDK_INT >= 22)
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1) {
  //code...
} else {
   //code.....
}
0 голосов
/ 31 декабря 2018

Я не знаю, какой метод вы вызываете, но здесь есть две разные вещи.

Android построен на Java, что означает, что у вас установлена ​​версия Java на вашем телефоне для запуска ОС.

Поскольку java получает обновления, в инфраструктуру добавляются некоторые методы, поэтому в 1.8 есть методы, которых нет в 1.7

Но Android также является платформой, которая получает обновления, вна этот раз мы являемся 28-й версией (https://developer.android.com/studio/releases/platforms).

Каждая из этой версии имеет новый набор методов, которых нет в предыдущей.

Так что если вы вызываете метод, которыйбыл представлен в Android 22, и вы запускаете свое приложение на телефоне API 16, это приведет к сбою.

Чтобы предотвратить это, вам придется окружить код, который требует Android API 22,

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1) {
   // call the method that needs API 22 at least
} else {
   // do something backward compatible
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...