java - 方法引用需要 API 级别 22

标签 java android java-8

基于 Use Java 8 language features方法引用兼容任何minSdkVersion,那为什么方法引用需要API level 22

目前,我在 build-gradle 中使用带有 com.android.tools.build:gradle:3.2.1 和 JDK 1.8 的 Android Studio 3.2.1我有:

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));
}

最佳答案

我不知道你在调用什么方法,但这里有两个不同的东西。

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
}

关于java - 方法引用需要 API 级别 22,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53987485/

相关文章:

java - 当将 `openjdk:11` 或 `openjdk:8` 与 CGroup 的实验标志一起使用时,是否仍需要 `-Xmx`

java - Java 中 2D/3D 世界的 vector

android - android中的SD卡存储

android - 从 Android : Best Approach? 中的 4 个静态 CSV 文件读取数据

Android/Iphone 设备数据在网络应用程序中的区别?

Java 流 |按相同元素分组

java-8 - 纳肖恩效率低下

java - 在 Java 8 中迭代流的最快方法是什么?

java - CXF-CODEGEN 生成的客户端需要 soap 信封上的命名空间

java - 使用 Java Streams 在复杂数据结构中搜索