只是想知道是否有人try 过在Android上使用新的Java 7语言功能?

推荐答案

如果您使用的是Android Studio,那么Java 7 language应该在没有任何补丁的情况下自动启用.试用资源需要API级别19+,缺少NIO 2.0.

如果您不能使用Java7功能,请参阅@Nuno关于如何编辑build.gradle的答案.

以下内容仅供历史参考.


Java7的一小部分当然可以在Android上使用(注意:我只在4.1上测试过).

首先,您不能使用Eclipse的ADT,因为只有Java编译器1.5和1.6是兼容的.你可以重新编译ADT,但我发现除了重新编译整个Android之外,没有简单的方法可以做到这一点.

但是您不需要使用Eclipse.例如,Android Studio 0.3.2IntelliJ IDEA CE和其他基于javac的IDE支持编译为Android,您甚至可以通过以下方式将兼容性设置为Java 8:

  • 文件→ 项目 struct → 模块→ (在第二个窗格中 Select 模块)→ 语言水平→ ( Select "7.0-钻石、手臂、多重抓捕等")

在IntelliJ上启用Java 7

这只允许Java7language features,您几乎不能从任何东西中获益,因为一半的改进也来自于库.您可以使用的功能是那些不依赖于库的功能:

  • 菱形运算符(<>)
  • 字符串switch
  • 多捕(catch (Exc1 | Exc2 e))
  • 下划线的数字文字(1_234_567)
  • 二进制文字(0b1110111)

这些功能不能用于yet:

  • try-WITH-RESOURCES语句-因为它需要不存在的接口"java.lang.AutoCloseable"(可以在4.4+中公开使用)
  • @SafeVargs批注-因为"java.lang.SafeVargs"不存在

... "然而":)事实证明,尽管Android的库的目标是1.6,但Android源代码确实包含像AutoCloseable这样的接口,而像Closeable这样的传统接口确实继承自AutoCloseable(尽管SafeVarargs确实缺失).我们可以通过反思来确认它的存在.它们之所以被隐藏,仅仅是因为Javadoc有@hide标签,这导致"android.jar"不包含它们.

关于如何恢复这些方法,目前已经存在一些问题.您只需将当前平台的现有"android.jar"引用与我们定制的引用结合起来,就可以使用许多Java 7 API(该过程与Eclipse中的过程类似.请判断项目 struct )→ SDK.)

除了AutoCloseable之外,(仅)还显示了以下Java 7 library features:

  • ConcurrentModificationException、LinkageError和AssertionError中的异常链接构造函数
  • 静电干扰.原语的compare()方法:Boolean.比较(),字节.比较().比较(),字符.compare(),整数.比较(),长.比较().
  • Currency:.getAvailableCurrenities()、.getDisplayName()(但without.getNumericCode())
  • BitSet:.previousSetBit()、.previousClearBit()、.valueOf()、.toLongArray()、.toByteArray()
  • Collections:.emptyEnumeration()、.emptyIterator()、.emptyListIterator()
  • AutoCloseable
  • Throwable:.addSuppress()、.getSuppress()和4参数构造函数
  • Character: .比较().isSurrogate().getName().highSurrogate().lowSurrogate().isBmpCodePoint()(但without.isAlphabetic()和.isIdeographic())
  • 系统:.lineSeparator()(未记录?)
  • java.lang.reflect.Modifier:.classModifier()、.structorModifier()、.fieldModifier()、.interfaceModifier()、.method Modifier()
  • NetworkInterface:.getIndex()、.getByIndex()
  • InetSocketAddress:.getHostString()
  • InetAddress: .getLoopbackAddress()
  • Logger:.getGlobal()
  • ConcurrentLinkedDeque
  • AbstractQueuedSynchronizer: .hasQueuedPredecessors()
  • DeflaterOutputStream:3个"syncFlush"的构造器.
  • Deflater:具有4个参数的.NO_FLUSH、.SYNC_FLUSH、.FULL_FLUSH、.Eflate()

基本上就这些.特别是,NIO 2.0不存在,并且没有array.asList仍然不是@SafeVarargs.

Java相关问答推荐

计算战舰沉船/船只的问题(Java)

伪类focus-in不适用于PFA中的选项卡

如何计算内循环的时间复杂度?

如何在带有Micronaut的YAML中使用包含特殊字符的字符串作为键

Spring Boot@Cachebale批注未按预期工作

AssertJ Java:多条件断言

为什么在maven中,getLast方法不适用于List?

try 在Android Studio中的infoWindow中使用EditText(Java)

如果按钮符合某些期望,如何修改它的文本?

Java泛型类方法的静态返回类型是否被类型擦除?

使用While循环打印素数,无法正常工作

二进制数据的未知编码/序列化

无法使用Freemarker从XML中读取重复的标记值

Java中HashSet的搜索时间与TreeSet的搜索时间

将双倍转换为百分比

向Java进程发送`kill-11`会引发NullPointerException吗?

循环不起作用只有第一个元素重复

Java List有一个在一个位置添加多个元素的方法,但我找不到一个在一个位置删除多个元素的方法

TinyDB问题,无法解析符号';上下文&

如何使用Rascal Evaluator从编译的JAR访问Rascal函数?