Intellij,Maven和Eclipse之间的编译差异

时间:2018-11-28 14:03:48

标签: java eclipse maven intellij-idea compilation

我有一个令人困惑的问题。首先,这里是一个最小的代码示例:

public interface I {
  <T> T getValue();
}

public abstract class AC<T> {
  private T value;

  public T getValue() {
    return value;
  }

  public void setValue(T value) {
    this.value = value;
  }
}

public class C extends AC<Integer> implements I {
}

public class Main {
  public static void main(String[] args) {
    final C c = new C();
    c.setValue(1);
    final Integer i = c.getValue();
    System.out.println(i);
  }
}

当我尝试使用javac或Intellij或Maven进行编译时,出现错误消息:

  

C不是抽象的,并且不覆盖I中的抽象方法getValue()

如果我在Eclipse中编译程序,则编译成功。

有人可以解释一下为什么日食可以解决这个问题吗?

这是我的软件版本:

  • Eclipse 2018-09(4.9.0)
  • Intellij 2018.1.3
  • Maven 3.3.1
  • Oracle JDK 8u181

更新:

我将此问题报告给Oracle,他们可以重现此问题。这是Oracle编译器(Java Bug Database)中的错误

2 个答案:

答案 0 :(得分:1)

Maven和Intellij都默认使用Oracle JDK的javac,而Eclipse具有自己的Java编译器。

javac或Eclipse编译器就在这里,由Java Language Specification确定。

我相信 Eclipse编译器在这里是正确的,因为您的示例结合了可以在两个编译器中单独使用且没有任何问题的两件事:

  • 通过继承的实现,例如g。:
public class ImplementationViaInheritance {
    public static void main(String[] args) {
        System.out.println(new C1().getClass());
    }
}

class SuperC1 {
    public void foo() {};
}

interface I1 {
    void foo();
}

class C1 extends SuperC1 implements I1 {
    // implements I1 via inheritance from SuperC1
}
public class AbstractClassWithoutAbstractMethods {
    public static void main(String[] args) {
        System.out.println(new C2().getClass());
    }
}

abstract class SuperC2 {
    public void foo() {};
}

class C2 extends SuperC2 {
    // no methods
}

答案 1 :(得分:-1)

在从非抽象类 C 实现接口 I 时,您需要重写抽象方法getValue()。将您的班级 C 修改为此:

public class C extends AC<Integer> implements I {
    public T getValue() {
        return value;
    }
}

或者您可以在其中实现getValue()方法时从类 AC 中实现 I 。从类 C 开始,只需扩展类 AC

public abstract class AC<T> implements I {
    private T value;

    public T getValue() {
        return value;
    }

    public void setValue(T value) {
      this.value = value;
    }
}

public class C extends AC<Integer> {

}