为什么Maven在Eclipse可以使用重载方法编译Java枚举?

时间:2016-07-15 22:27:41

标签: java eclipse maven enums compiler-errors

如果我在Java 枚举实例(例如SwallowSpecies.AFRICAN.calculateMaxAirspeedVelocity())中声明一个重载枚举类的静态方法(例如SwallowSpecies.calculateMaxAirspeedVelocity(double, double))的方法,则使用Maven进行编译导致以下编译错误:

  enum中的

方法calculateMaxAirspeedVelocity不能应用于给定类型;
   要求:没有参数
   发现:双,双
   原因:实际和正式的参数列表长度不同

由于某种原因,编译器在没有使用类SwallowSpecies限定的情况下找不到该方法。但是,为什么完全相同的代码根据Eclipse §内部使用的编译器进行构建? - 这里是相关的代码:

public enum SwallowSpecies {
    AFRICAN {

        double calculateMaxAirspeedVelocity() {
            // This line compiles within Eclipse but not when compiling with Maven
            return calculateMaxAirspeedVelocity(3.0, 0.5);
            // This line compiles both with Maven's and with Eclipse's compiler
//          return SwallowSpecies.calculateMaxAirspeedVelocity(3.0, 0.5);
        }

    };

    private static double calculateMaxAirspeedVelocity(final double maxWeight, final double weightRatio) {
        // Dummy logic
        return 1.0;
    }

}

有趣的是,使用内部类而不是枚举的类似情况对于Eclipse的编译器和Maven来说都是无效的 - 这里的区别是什么?

public class SwallowSpecies {

    private static class African {
        double calculateMaxAirspeedVelocity() {
            // This line doesn't compile
            return calculateMaxAirspeedVelocity(3.0, 0.5);
            // This line does
//           return SwallowSpecies.calculateMaxAirspeedVelocity(3.0, 0.5);
        }
    }

    private static double calculateMaxAirspeedVelocity(final double maxWeight, final double weightRatio) {
        // Dummy logic
        return 1.0;
    }

}

我使用Maven的编译器sourcetarget设置为1.61.71.8测试了这种现象,它发生在所有这些不同的设置。

使用Maven版本3.16.0-38-generic并使用

进行测试
  • Oracle的JDK版本1.8.0_91来自Ubuntu的DEB oracle-java8-installer版本8u92+8u91arm-2~really8u91~webupd8~0以及
  • 来自Ubuntu的DEB 1.7.0_101openjdk-7-jdk
  • 的OpenJDK版本7u101-2.6.6-0ubuntu0.14.04.1

§版本4.5.2; build ID 20160218-0600

1 个答案:

答案 0 :(得分:2)

oracle和eclipse编译器之间确实存在一些差异。 Eclipse使用自己的编译器,因为

  

它允许运行和调试仍包含未解决错误的代码。

请参阅enter link description here

不同的实现会带来不同行为的风险,如您在此处所见。

到目前为止,我总是发现Oracle或OpenJdk编译器(我在maven中使用)比eclipse更严格。 在极少数情况下(我会说每年不超过一次)我不得不进行小幅调整,以便代码在maven和eclipse中编译。