3

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

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
  • 甲骨文 JDK 8u181

更新:

我将此问题报告给 Oracle,他们可以重现此问题。这是 Oracle 编译器中的一个错误(Java 错误数据库

4

2 回答 2

1

Maven 和 Intellij 都使用(默认情况下)javacOracle JDK,而 Eclipse 有自己的 Java 编译器。

哪个编译器javac或 Eclipse 编译器在此处由Java Language Specification确定。

我相信Eclipse 编译器在这里是正确的,因为您的示例结合了两个可以与两个编译器分开工作的东西,没有任何问题:

  • 通过继承实现接口,例如:
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
}
于 2018-11-28T15:10:29.503 回答
-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> {

}
于 2018-11-28T14:09:10.113 回答