操作系统版本,API级别和Java版本之间的关系

时间:2017-11-10 20:40:09

标签: java android android-version

我知道这里有很多关于Android API级别和版本的问题,但这个问题有所不同所以请不要将其标记为重复。

我想知道Java版本1.6,1.7,1.8 ......是如何与这两者相关的。我混淆的原因是我尝试将Pattern.compile方法与Pattern.UNICODE_CHARACTER_CLASS标志一起使用,如下所示。

Pattern pattern = Pattern.compile("\\b" + keywordToCheck + "\\b", Pattern.UNICODE_CHARACTER_CLASS);

Pattern.UNICODE_CHARACTER_CLASS java.lang.IllegalArgumentException: Unsupported flags: 256 开始,它表示自从:1.7,我认为这意味着它在Java 1.7及更高版本中可用。我试图在Android项目中使用那行代码,但每次我在我的设备上运行它时都会得到:

defaultConfig {
        minSdkVersion 19
        targetSdkVersion 26
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }

以下是build.gradle文件的相关部分

Android Studio 3.0
Build #AI-171.4408382, built on October 20, 2017
JRE: 1.8.0_152-release-915-b08 x86_64
JVM: OpenJDK 64-Bit Server VM by JetBrains s.r.o
Mac OS X 10.12.6

根据我的理解,这意味着我的应用程序将使用任何API级别19及以上,这意味着它可以在Android 4.4(KitKat)或更高版本上运行。我运行应用程序的设备有Android 6.0。 Java版本如何适应这个?我正在使用说我正在使用的Android Studio 3.0:

var referenceKeys = array2.map(function(entity) { return entity.id; });

var result = array1.filter(function(entity) {
    return referenceKeys.indexOf(entity.id) !== -1;
});

有人可以向我解释为什么我会收到此错误,以及Android API级别,版本和Java版本之间的关系?谢谢

2 个答案:

答案 0 :(得分:6)

对于您给出的示例,该标志在API 24之前未添加。在很多情况下,即使先前添加了对给定语言级别(例如7)的支持并不意味着所有内容都会立即添加。有些事情是等待谷歌等待它的原因。

我不能告诉你为什么,因为我不知道。

正如Gabe所说,Java的版本并不一定与Android兼容。

因此,由于您在API 19及更高版本上使用标记的代码,您将在19和23之间的版本上崩溃,因为尚未添加该标记。

同样值得注意的是,版本兼容性并不限制Android版本的Java版本。现在,您可以在任何版本的Android上运行Java 8。这是兼容性。

然而。如果您阅读Android Java 8 Language Features,则说(强调我的):

  

Android Studio 3.0及更高版本支持所有Java 7语言功能和 Java 8语言功能的子集,这些功能因平台版本而异

我在这里使用Java 8作为示例,但这主要适用于Android和Java的每个版本。

<强>本质:

  • 您使用的旗帜在API 24之前未添加.AFAIK,即使硬编码变量存在,也未添加使用情况
  • Android并不一定拥有每一个Java API,而且这些API因Android版本而异。
  • Java的版本不受API限制,但可访问的功能各不相同。这意味着如果您愿意,可以在API(随机数)12上运行Java 8.

两者之间没有固定的关系(Android [x] = Java [x])。最终可以立即添加不同的字段/方法/类(在发布对给定版本的Java的支持时)或根本不添加。

Android中使用的常规Java和Java版本是两个非常不同的,因为Android是基于平台的,而Java是基于版本的。您无法比较它们之间的版本,它们都有单独的文档。

值得注意的是,对于Android(Java)问题,您应该查看可以在API reference中找到的Android文档,而不是使用不适用于Android的Oracle文档因为API的巨大差异。

答案 1 :(得分:3)

从1.7开始提供时,请注意您正在查看的文档 - Oracle(官方Java文档)。所以它永远是Java版本。 Android文档将始终为您提供Android SDK版本。

请注意,Android并不总是与Java的官方版本100%兼容。它试图成为,但显然大型的图书馆不存在。如有疑问,请查看该类的Android文档,而不是Oracle。

至于Java版本 - 他们大多数都是独立于Android版本的。 Java 8刚刚正式完全支持AS3。在此之前它被认为是实验性的。如果需要,您仍然可以使用Java 7。对于Java 8,大多数语言功能都可以在所有平台上使用,但是一个或两个需要至少24个SDK版本。我知道的两个是Java流和注释类型/重复注释。

针对您的具体问题,请注意android文档说明了这个标志:“这个标志对Android没有影响,总是使用unicode字符类。”所以你可以删除它。