小编典典
如果你使用的是Android Studio,则应自动启用Java 7 语言,而无需任何补丁。尝试资源要求API级别为19+,并且缺少NIO 2.0。
如果你无法使用Java 7功能,请参阅@Nuno关于如何编辑的答案build.gradle。
以下内容仅出于历史目的。
Java 7的一小部分肯定可以与Android一起使用(注意:我仅在4.1上进行过测试)。
首先,你不能使用Eclipse的ADT,因为它被硬编码为仅兼容Java编译器1.5和1.6。你可以重新编译ADT,但是我发现除了将整个Android一起重新编译之外,没有其他简单的方法可以做到这一点。
但是你不需要使用Eclipse。例如,Android Studio 0.3.2,IntelliJ IDEA CE和其他基于Javac的IDE支持编译到Android ,你甚至可以通过以下方式设置对Java 8的兼容性:
文件→项目结构→模块→(在第二个窗格中选择模块)→语言级别→(选择“ 7.0-Diamonds,ARM,multi-catch等”)
在IntelliJ上启用Java 7
这仅允许Java 7 语言功能,并且你几乎无法从中受益,因为一半的改进也来自库。你可以使用的功能是那些不依赖于库的功能:
Diamond operator (<>)
String switch
Multiple-catch (catch (Exc1 | Exc2 e))
Underscore in number literals (1_234_567)
Binary literals (0b1110111)
该try-with-resources语句-因为它需要非现有的接口“java.lang.AutoCloseable”(这个可以公开在4.4或以上版本使用)
@SafeVarargs批注-因为“ java.lang.SafeVarargs”不存在
…“ yet” :)事实证明,尽管Android库的目标是1.6,但Android源代码确实包含AutoCloseable之类的接口,而像Closeable这样的传统接口确实继承自AutoCloseable(尽管确实缺少SafeVarargs)。我们可以通过反思来确认它的存在。它们之所以被隐藏仅仅是因为Javadoc具有@hide标记,从而导致“ android.jar”不包含它们。
已经存在一个问题,如何使用隐藏的和内部的API构建Android SDK?关于如何找回这些方法的知识。你只需要用我们自定义的平台替换当前平台的现有“ android.jar”引用,那么许多Java 7 API都将可用(该过程类似于Eclipse中的过程。请检查项目结构→SDK。)
除了自动关闭功能之外,(仅)还显示了以下Java 7 库功能:
ConcurrentModificationException,LinkageError和AssertionError中的异常链接构造函数
用于基元的静态.compare()方法:Boolean.compare(),Byte.compare(),Short.compare(),Character.compare(),Integer.compare(),Long.compare()。
货币:.getAvailableCurrencies()、. getDisplayName()(但不带 .getNumericCode())
BitSet:.previousSetBit()、. previousClearBit()、. valueOf()、. toLongArray()、. toByteArray()
集合:.emptyEnumeration()、. emptyIterator()、. emptyListIterator()
自动关闭
Throwable:.addSuppressed()、. getSuppressed()和四参数构造函数
字符:.compare()、. isSurrogate()、. getName()、. highSurrogate()、. lowSurrogate()、. isBmpCodePoint()(但不包括 .isAlphabetic()和.isIdeographic())
系统:.lineSeparator()(未记录?)
java.lang.reflect.Modifier:.classModifiers()、. constructorModifiers()、. fieldModifiers()、. interfaceModifiers()、. methodModifiers()
NetworkInterface:.getIndex()、. getByIndex()
InetSocketAddress:.getHostString()
InetAddress:.getLoopbackAddress()
记录器:.getGlobal()
并发链接双端队列
AbstractQueuedSynchronizer:.hasQueuedPredecessors()
DeflaterOutputStream:3个带有“ syncFlush”的构造函数。
Deflater:.NO_FLUSH,.SYNC_FLUSH,.FULL_FLUSH,.deflate()用4个参数
基本上就是全部。特别是,NIO 2.0不存在,并且Arrays.asList仍然不是@SafeVarargs。
2020-03-11