如何防止Java 为较新的SDK 编译部分代码?

How to prevent Java to compile parts of code for newer SDK?

我想编写适用于 Java 1.8 和 1.7 的代码。具体来说,我想在接口中实现一个静态方法。这在 java 8 中是允许的,但在 7 中是不允许的。我读到有一种管道 C 宏的方法,而且这不是好的做法。此外,管道宏没有告诉我正在使用哪个 SDK?

所以有任何 "good" 解决方案吗?

更新:

请不要建议实现抽象 class。谢谢。

没有重复

Can Java 8 code be compiled to run on Java 7 jvm?问有没有办法通过命令行把java1.8的代码编译成1.7。至少答案看起来是这样。我做的问题是,是否有一种方法可以在代码中指示代码中哪些部分属于 1.8,哪些部分属于 1.7。

没有干净的 Java 方法可以做到这一点。有几种方法(您也可以结合使用)来实现它。该解决方案的核心是一个小型代码生成器,它可以生成您需要的代码。您必须配置构建系统以在调用 javac 之前调用生成器。

  1. 将代码放入不同的文件(页眉、页脚、Java 8 代码)并在构建系统的准备步骤中创建最终的 Java class(只需连接您需要的零件)。对于 Maven,那将是 generate-sources。对于 Ant,使用一组目标。
  2. 将代码放在同一个文件中,并使用魔术注释指定代码的开始和结束位置。代码本身在第一列中用行注释注释掉:

    /*!!!JAVA8-START!!!*/
    //...Java 8 code...
    /*!!!JAVA8-END!!!*/
    

    如果您的构建系统检测到 Java 8,它可以搜索两个注释之间以 // 开头的行并删除 //.

  3. 如果你使用Maven,你可以拥有三个模块。包含非 Java 7/8 特定代码的通用模块。一个模块用于 Java 7,一个模块用于 Java 8。使用 build profile 启用特定模块。使用单元测试确保 Java 7 和 8 模块中的代码相同(例如通过删除 Java 8 特定部分并将其余部分与 Java 7 进行比较) .