【问题标题】:Determine if Java language feature is available in particular Android SDK (platform)确定 Java 语言功能在特定 Android SDK(平台)中是否可用
【发布时间】:2017-09-26 12:50:58
【问题描述】:

我正在学习 Android 开发,我注意到 findViewById() 的文档说强制转换其返回的对象是不必要的:

<Android API 26 Platform>
... resulting view is automatically cast to the target class type...

如果不需要,我宁愿不强制转换(编写和阅读的代码更少!),但这似乎是 Java 8 的一个特性。然而,我希望我的应用程序可以在 19 岁(Kitkat)之前的平台上运行。

https://developer.android.com/studio/write/java8-support.html 页面似乎没有涵盖 Java 8 中可用的自动类型转换,并且关于 SO 的各种其他问题/答案表明 Java 8 的一些功能在 SDK 中一直可用9.

首先,我如何判断 Java 语言功能是否在我的目标 SDK 范围内?其次,几年前的平台 API 怎么可能支持新的语言特性?

【问题讨论】:

  • 这似乎是 Java 8 的一个特性。 - 它与 java 版本无关。这取决于 android SDK 中的语法,它在版本 26 中发生了变化,所以如果你 targetSdk 26 你可以使用这个功能
  • @TimCastelijns 感谢您的澄清,但这并不完全正确:只要 compileSdk >= 26,您就可以使用它,无论目标 SDK 是什么。此外,这不会使我的问题无效,因为Android supports ... a subset of Java 8 language features that vary by platform version.

标签: java android casting java-8


【解决方案1】:

如果您的compileSdkVersion is &gt;= 26Android O,则不必强制转换findViewById() 返回的对象。它与 java 8 无关。

如果特定 API 不受支持或弃用,Android Studio 将根据 API 显示错误或警告。

【讨论】:

    【解决方案2】:

    帖子表明“这与 Java 8 无关”。这似乎只是部分正确,在某种程度上不会使我的 2 个问题无效。因此,这是我自己的结论,基于我自 OP 以来所做的额外阅读,我将根据回复进行修复。

    官方文档很清楚:Android supports ... a subset of Java 8 language features that vary by platform version

    请注意术语“语言功能”,而不是“API”。后者通常是指在特定 SDK 中定义的常量、类和类成员(以及方法的签名),并且可以从您的代码中访问/调用;而“语言特性”是诸如运算符、优先规则、try-with-resource 等。因此,虽然“SDK”和“API”经常互换使用,但它们在 Android 上可能并不相同:SDK 可能是 API +工具(如编译器、转译器、错误检查脚本等)。

    这句话暗示随着 SDK 级别的提高,越来越多的 Java 8 规范的语言特性成为支持。关键字是“支持”:如果 语言特性 A 在 SDK 27 中受支持但在 26 中不支持,并且您使用compileSdk: 27 编译程序,并且它在平台为 26 的 Android 设备上正确运行(这假设您的程序不使用任何新的 API 27,它只使用新的语言特性,如新的运算符等),有什么魔力在起作用?

    我唯一的解释(我希望我的 OP 中第二个问题的答案)是我在发布时不知道的附加编译:从 Java 生成的 Java 字节码(.class 文件)编译器被转译为 DEX 格式。这个额外的步骤涉及一个工具,它不是 API 的一部分,但可能是 SDK 的一部分。这个 DEX 编译器是实现 language 功能的地方:如果 DEX 编译器不知道如何转译 Java 字节码,则 Android 不支持该运算符。这表明在可能的情况下,新的 Java 字节码可能不会转换为新的 DEX 字节码;相反,它们被转换为在较旧平台(具有较旧的 Dalvik VM)中执行操作的 DEX 字节码的等效 sequence。当这种等效性过于繁琐而无法确定时,就是 minSdk 受到影响(那么旧的 Dalvik VM 根本无法运行 DEX 文件)。

    对于我的第一个问题,每个 SDK 可能都包含“检查规则”,用于检查 DEX 编译器尚不支持的 Java JDK 功能,从而判断给定 SDK 范围内是否支持 JAVA 语言功能是 lint,并假设 linter 使用的检查规则标记所有问题都正确(没有误报或否定)。

    欢迎指正!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-06-05
      • 2011-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-01
      相关资源
      最近更新 更多