首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >尽管使用了Java 8特性,项目如何支持Java 7?

尽管使用了Java 8特性,项目如何支持Java 7?
EN

Stack Overflow用户
提问于 2016-08-12 02:01:55
回答 2查看 1.3K关注 0票数 5

我正在回顾github上的HikariCP项目,它声明它支持“Java7和Java8maven工件”,在其源代码中,它使用了一些Java8特性:

代码语言:javascript
复制
java.util.function.Consumer;
java.util.function.Predicate;
java.util.function.UnaryOperator;

我想如果这个项目被其他Java 7引用,就会出现错误。那么,项目是如何同时支持Java 7和Java 8的呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-08-12 08:04:47

这不是一个错误(正如我自己所想的)。这个项目确实使用Java 8中的类,它不使用Java 7进行编译,它的Maven构建也不使用Java 7运行。

但是,由于Java 8特有的特性(如Lambdas )在源代码中没有使用,所以它确实与Java 7一起运行。

尝试创建一个Java 7项目,将HikariCP声明为依赖项,并运行以下代码:

代码语言:javascript
复制
import com.zaxxer.hikari.util.FastList;

public class Main {

    public static void main(String[] args) {

        FastList<String> fastList = new FastList<>(String.class);
        fastList.add("Hello");
        System.out.println(fastList);
    }
}

它成功运行了。另一方面,以下代码失败:

代码语言:javascript
复制
fastList.removeIf(null);

这是因为removeIf()和其他一些方法使用Java 8中的类,因此无法在Java 7中运行。但是它们都抛出了UnsupportedOperationException ,不管怎么说,!您可能会注意到,导入Java8类的惟一类是com.zaxxer.hikari.util.FastList。我不知道他们为什么这么做。

UPDATE:只想澄清项目字节码的版本是1.7,可以很容易地用反编译器或十六进制验证。它的源代码确实符合Java 7,因此可以用

代码语言:javascript
复制
<source>1.7</source>
<target>1.7</target>

正如@Puce所指出的。

另一方面,它必须使用JDK1.8进行编译,以便在编译过程中可以使用源代码中引用的Java 8类。编译完代码后,只要不尝试加载缺少的Java8类(在本例中是从java.util.function包中),它就可以与Java 7一起运行。

票数 5
EN

Stack Overflow用户

发布于 2016-08-12 07:47:16

代码语言:javascript
复制
<plugin>
               <groupId>org.apache.maven.plugins</groupId>
               <artifactId>maven-compiler-plugin</artifactId>
               <version>3.5.1</version>
               <extensions>true</extensions>
               <configuration>
                  <source>1.7</source>
                  <target>1.7</target>
               </configuration>
</plugin>

这可能是项目的一个错误。

指定源和目标级别只会尊重语言特性并影响字节码版本。未检查API。

如果他们使用JDK 8来构建项目,那么该项目就可以正常构建。但我怀疑它是否能用JDK 7编译。

他们可能认为在这里指定1.7将使其支持Java 7,而这并不是自动正确的。

您试过用Java 7访问库吗?

这个项目的好消息是,支持Java 7似乎很容易。FastList只是一个列表实现。由于列表接口已经在Java 8中进行了扩展,所以即使它们只抛出一个UnsupportedOperationException,它们也被迫实现新方法。

通过使用JDK 7构建项目,他们可以轻松地删除那些看似不需要的方法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38908722

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档