如果我在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的编译器source
和target
设置为1.6
,1.7
和1.8
测试了这种现象,它发生在所有这些不同的设置。
‡使用Maven版本3.16.0-38-generic
并使用
1.8.0_91
来自Ubuntu的DEB oracle-java8-installer
版本8u92+8u91arm-2~really8u91~webupd8~0
以及1.7.0_101
版openjdk-7-jdk
7u101-2.6.6-0ubuntu0.14.04.1
§版本4.5.2; build ID 20160218-0600
答案 0 :(得分:2)
oracle和eclipse编译器之间确实存在一些差异。 Eclipse使用自己的编译器,因为
它允许运行和调试仍包含未解决错误的代码。
请参阅enter link description here
不同的实现会带来不同行为的风险,如您在此处所见。
到目前为止,我总是发现Oracle或OpenJdk编译器(我在maven中使用)比eclipse更严格。 在极少数情况下(我会说每年不超过一次)我不得不进行小幅调整,以便代码在maven和eclipse中编译。