方法参考需要API级别22

时间:2018-12-31 12:22:38

标签: java android java-8

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

当前,我在{em> build-gradle 中使用带有/**和JDK 1.8的Android Studio 3.2.1,

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

2 个答案:

答案 0 :(得分:2)

我不知道您正在调用什么方法,但是这里有两件事。

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
}

答案 1 :(得分:0)

Ref:Lambda expressions

  

Java 8支持的语言功能

在撰写本文时,对Java 8语言的Android支持尚未完成。但是,所有主要功能均受支持,其中某些功能(例如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.....
}