方法引用需要API 22及以上的版本

3
根据 使用Java 8语言特性 ,方法引用与任何minSdkVersion兼容,那为什么方法引用需要API级别22
目前,我正在使用Android Studio 3.2.1 和 JDK 1.8,并在build-gradle中具有:com.android.tools.build:gradle: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));
}

那么你安装了哪些 API 版本? - Reg Edit
@RegEdit,我正在使用minSdkVersion 16,但是lambda表达式和方法引用只是语法糖,因此gradle必须能够在匿名类中编译它们。 - matoni
Gradle必须能够编译匿名类,这是一个非常有趣的期望,我必须说。 - Naman
@Henry 我正在调用 Bundle 的 put{SomeType} 方法,例如 boolean、String 等,这些方法也存在于我正在使用的 minSdkVersion 16 中。 - matoni
1
@nullpointer 我的期望基于使用Java 8语言特性 - matoni
显示剩余3条评论
2个回答

3

我不知道你调用的是哪个方法,但这里有两个不同的事情。

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
}

0

参考: Lambda表达式

Java 8支持的语言特性

在本文撰写时,Android对Java 8的语言支持还不完整。然而,所有主要的特性都得到了支持,其中一些(如lambda表达式)也被移植到了API级别23及以下。

以下是支持的特性列表:

  • Lambda表达式(也适用于API <= 23)

  • 方法引用(也适用于API <= 23)

  • 类型注解(也适用于API <= 23)

  • 默认和静态接口方法

  • 可重复注解

除了上述列出的特性之外,值得一提的是Stream API同样得到了支持,以及其他一些特性(完整列表请参阅官方文档)。

需要API 22或更高版本的代码请使用相关代码包装。

//if(Build.VERSION.SDK_INT >= 22)
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1) {
  //code...
} else {
   //code.....
}

2
“Jack”编译器已经死得像渡渡鸟一样。 - Sartorius
1
@Sartorius 谢谢你,非常抱歉,我只是复制了内容,忘记编辑了。 - Ashvin solanki

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接