[英]Compilation differences between Intellij, Maven and Eclipse
我有一个令人困惑的问题。 这里首先是一个最小的代码示例:
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可以处理这个而不是其他所有吗?
这是我的软件版本:
更新:
我向Oracle报告此问题,他们可以重现此问题。 这是Oracle编译器中的一个错误( Java Bug数据库 )
Maven和Intellij都使用(默认情况下)Oracle JDK的javac
,而Eclipse有自己的Java编译器。
这里的编译器, javac
或Eclipse编译器由Java语言规范决定 。
我相信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
}
abstract Classes
),例如: 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
}
当您从非抽象类C实现接口I时 ,您需要覆盖抽象方法getValue()。 将您的C类编辑为:
public class C extends AC<Integer> implements I {
public T getValue() {
return value;
}
}
或者你可以在那里实现getValue()方法时从AC类实现我 。 从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> {
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.