Android+core LibraryDesugering:我可以期待哪些Java 11API能夠工作? [英] Android + coreLibraryDesugaring: which Java 11 APIs can I expect to work?
問題描述
我正在嘗試將一些Java庫從‘普通’JVM遷移到Android,并堅持使用代碼中使用的一些Java 11 API。
我已經得到的第一件事--Java11語言功能似乎只適用于Android Studio的Canary版本,請參閱答案here
現在我需要了解哪些API是真正可以使用的。這里有兩個用例對我不起作用,我不知道我是做錯了什么,還是永遠不應該起作用:
List.copyOf()
-在Java 11中引入的方法copyOf
在Android上不可用。Java 9中引入的方法‘List.of()’工作正常。類
java.lang.invoke.LambdaMetafactory
-在Java 1.8中引入-用于編程創建lambdas以供使用,而不是用于反射,在Android上不可見。
我在desugar_jdk_libs
的源代碼中都看到了它們:
- https://github.com/google/desugar_jdk_libs/blob/master/jdk11/src/java.base/share/classes/java/lang/invoke/LambdaMetafactory.java
- https://github.com/google/desugar_jdk_libs/blob/master/src/share/classes/java/util/List.java
復制步驟:
- 使用Android Studio Canary生成虛擬的基本活動和項目
- 確保
build.gradle
中提供了以下內容
android {
compileOptions {
coreLibraryDesugaringEnabled true
sourceCompatibility JavaVersion.VERSION_11
targetCompatibility JavaVersion.VERSION_11
}
}
dependencies {
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.5'
}
- 在代碼中的某處添加以下行
List<Integer> ints1 = List.of(1, 2, 3);
Supplier<List<Object>> listSupplier = () -> new ArrayList<>();
List<Object> alist = listSupplier.get();
List<Integer> ints2 = List.copyOf(ints1);
LambdaMetafactory.metafactory(null,null,null,null,null,null);
最后2行無法為我編譯。
PS:最終應用程序應該可以在Android 10+上運行。
推薦答案
Desugering lib被認為是非官方的。我們不能期望一個確切的答案。當功能準備好時,我們就會得到它?,F在,List.CopyOf()方法正在使用最新的Gradle版本。
關于LambdaMetafactory
類,它不包括在Android Javadoc中。這意味著我們假設我們根本沒有LambdaMetafactory
。谷歌精簡了一些Java API,稱其輕量級。
一般來說,我們應該先檢查Android Javadoc。如果Android Javadoc沒有提到一些API。我們可以肯定,我們不會在短期內獲得該功能。
這篇關于Android+core LibraryDesugering:我可以期待哪些Java 11API能夠工作?的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持IT屋!