但是我DID覆盖了那个抽象方法

时间:2014-09-01 17:04:06

标签: java abstract-class

我一定是个白痴,但我不知道我的错误在这里。

final class EmptyBench extends MicroBench {
    long doIterations(long numIterations) throws InterruptedException {
        return numIterations;
    }
}

这扩展了包含此声明的类MicroBench:

abstract long doIterations(long numIterations) throws InterruptedException;

我收到此错误:

EmptyBench.java:6: error: EmptyBench is not abstract and does not override abstract method doIterations(long) in MicroBench

看不到任何泛型,返回类型没有变化,throws子句没有变化。有人能告诉我我在这里失踪了吗?

3 个答案:

答案 0 :(得分:2)

查看签名,并始终使用@Override - 您的IDE甚至可以帮助自动完成。您确定要扩展正确的MicroBench;也许你有不同包装的几个版本?

@Override
public long doIterations(long numIterations) throws InterruptedException {

BTW大多数IDE允许您生成用于覆盖方法的代码,可能是在边距中的错误图标/实现所有抽象方法。

答案 1 :(得分:2)

使用这些类,我可以重现这个问题:

package a;

public abstract class A {
    abstract void method();
}

package b;

import a.A;

public final class B extends A {
    void method() {}
}

但是,我的IDE(Eclipse)给了我一个不同的错误消息,所以YMMV:

  

此类必须实现继承的抽象方法A.method(),但不能覆盖它,因为它在B中不可见。要么使类型为abstract,要么使继承的方法可见

我没有任何要添加到此错误消息的内容,但是,如果您不控制MicroBench类,则表示运气不佳。

作为旁注,如果B是抽象的而不是最终的,那么您可以创建一个类a.C extends b.B,而这个类又可以实现a.A.method()

答案 2 :(得分:0)

还有另一个原因可能导致这种情况发生。 Java并不总是喜欢将类扩展到包之外。在eclipse中,如果您具有包含MicroBench的程序包1和包含EmptyBench的程序包2,由于程序包权限,您将无法扩展该MicroBench类。