我正在学习Android开发,我注意到findViewById()的docs说转换返回的对象是不必要的:
<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似乎没有涵盖Java8中可用的自动类型转换,因此各种其他问题/答案表明,Java8的某些特性一直可用到SDK 9中。
首先,如何判断Java语言特性是否在目标SDK的范围内?其次,在已有几年历史的platform中,如何可能支持新的语言特性?
发布于 2017-09-26 13:04:47
如果您的findViewById()即Android O,则不必强制转换由compileSdkVersion is >= 26返回的对象。它与java 8无关。
如果不支持或不推荐特定API,则Android将显示错误或警告,取决于API。
发布于 2017-09-28 05:43:45
文章指出,“这与Java 8无关”。这似乎只是部分正确,在某种程度上不会使我的两个问题失效。这是我自己的结论,基于我自操作以来所做的额外阅读,我将根据回应来修正它。
官方文档很清楚:Android支持..。Java 8语言特性的子集,这些特性因平台版本而异。
注意术语“语言特性”,而不是"API“。后者通常是指在特定SDK中定义的常量、类和类成员(以及它们的签名),以及代码中的可访问/可调用的;而“语言特性”是诸如操作符、优先级规则、尝试-with--资源等。因此,虽然" SDK“和" API”通常是交替使用的,但在Android上它们可能不一样:SDK很可能是API+工具(比如编译器、转换程序、错误检查脚本等)。
引用意味着随着SDK级别的提高,越来越多的Java 8规范的语言特性得到了支持。关键词是“支持”:如果SDK 27支持语言特性A,26岁时不支持它,然后用compileSdk: 27编译程序,然后它在带有平台26的安卓设备上正确运行(假设程序不使用新的API 27中的任何一个,它只是使用新的语言特性,比如一个新的操作符等等),那么有什么神奇的作用呢?
我唯一的解释(我希望对我的操作中的第二个问题的答案)是我在发布时不知道的额外编译:从Java编译器生成的Java字节码(.class文件)被转换成DEX格式。这个附加步骤涉及一个工具,它不是API的一部分,但可能是SDK的一部分。这个DEX编译器实现了语言特性:如果DEX编译器不知道如何转换Java字节码,那么Android就不支持这个操作符。这表明,在可能的情况下,新的Java字节码可能不会转换为新的DEX字节码;相反,它们会被转换成DEX字节码的等效序列,该字节码在旧平台中执行操作(该平台具有旧的Dalvik VM)。当这种等价性太重而无法确定时,就是当minSdk受到影响时(因此,旧的Dalvik根本无法运行DEX文件)。
对于我的第一个问题,每个SDK可能包括检查那些尚未被DEX编译器支持的Java JDK特性的“检查规则”,因此判断给定SDK范围中是否支持JAVA语言特性的方法是链接,并假设linter使用的检查规则所有问题都是正确的(没有错误的肯定或否定)。
欢迎任何更正!
https://stackoverflow.com/questions/46427097
复制相似问题