确定是否Java语言的特点是特别的Android SDK(平台)

确定是否Java语言的特点是特别的Android SDK(平台)

问题描述:

我学习Android开发可用的,我注意到该文档的findViewById()说,铸造其返回的对象是不必要的:确定是否Java语言的特点是特别的Android SDK(平台)

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

我如果我不需要(更少的代码来编写和阅读!),我更喜欢不投射,但这似乎是Java 8的一个特性。然而,我希望我的应用能够在19岁(奇巧)的平台上工作。

https://developer.android.com/studio/write/java8-support.html似乎并没有涵盖在Java中8可用的自动类型转换,以及各种其他问题/ SO上回答表明,的Java 8的一些功能都可用所有SDK 9中

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

+3

*这似乎是一个Java 8功能。* - 它与java版本无关。它取决于android SDK中的语法,在26版本中进行了更改,因此如果targetSdk 26可以使用此功能 –

+0

@TimCastelijns感谢您的澄清,但这并非完全正确:只要compileSdk> = 26,您就可以使用它,无论目标SDK如何。此外,这并不会使我的问题无效,因为[Android支持... Java 8语言功能的子集,因平台版本而异](https://developer.android.com/guide/platform/j8-jack.html)。 – Schollii

如果您的compileSdkVersion is >= 26Android O您不必投掷由findViewById()返回的物体。它与java 8无关。

如果不支持或不赞成使用某个API,Android Studio将根据API显示错误或警告。

文章指出“这与Java 8无关”。这似乎只是部分正确的,但不会使我的两个问题无效。所以这里是我自己的结论,基于自从我的OP之后做的额外阅读,并且我会根据回复来修复它。

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

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

的报价意味着在SDK水平的提高,越来越多的语言的Java 8的功能规格成为支持。关键字是“支持”:如果语言功能 A在SDK 27支持,但不在26,并且您使用compileSdk: 27编译程序,并且它在具有平台26的Android设备上正确运行(假定您的程序不使用任何新的API 27,它只是使用新的操作符等新的语言功能),玩什么魔术?

我唯一的解释(我希望我的OP中的第二个问题的答案)是额外的编译,我不知道什么时候发布:Java字节码(.class文件)从Java编译器被转换为DEX格式。这个额外的步骤涉及一个工具,它不是API的一部分,但可能是SDK的一部分。这个DEX编译器是语言功能得到实现:如果DEX编译器不知道如何传输Java字节码,那么Android不支持该运算符。这表明,如果可能,新的Java字节码可能不会转换为新的DEX字节码;相反,它们被转换为执行旧平台(其具有较老的Dalvik VM)中的操作的DEX字节码的等效序列。当这样的等价过于繁琐而无法确定时,minSdk会受到影响(那么老式的Dalvik虚拟机就无法运行DEX文件了)。

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

任何更正欢迎!