Java 8默认方法覆盖(以及Eclipse)

4

我是一名Java 8开发者。

我有以下接口声明:

public interface IRequestBuilder {
    public String processParameters();
}

从这个接口中,我衍生出另一个接口:

public interface IMyRequestBuilder extends IRequestBuilder {

    @Override
    default String processParameters(){
        return createBody();
    }

    String createBody();

}

我从IRequestBuilder派生出另一个接口,其中processParameters()不是默认设置,为了其他目的。

一切都很顺利,唯一的问题是每个我从IMyRequestBuilder派生的类都要求我实现processParameters(),但我不想这样做,因为它是一个默认方法。

我在Eclipse上工作 - 这只是一个Eclipse问题吗?我该如何避免这种情况?


一个类并不要求任何东西。你在做什么,以及会发生什么事情? - JB Nizet
1
可能是因为Eclipse生成的类(如果使用类创建向导)包含默认方法的空主体,只需将其删除即可正常编译。这很可能是一种特性而不是问题。 - A4L
1个回答

4
你在这里看到的只是Eclipse的一个bug。
让我们考虑下面的代码:
interface IRequestBuilder {
    public String processParameters();
}

interface IMyRequestBuilder extends IRequestBuilder {
    @Override
    default String processParameters() {
        return createBody();
    }
    String createBody();
}
class A implements IMyRequestBuilder {

}

Eclipse会正确地给出编译错误:

类型A必须实现继承的抽象方法IMyRequestBuilder.createBody()

它提供了快速修复选项,包括“添加未实现的方法”快速修复。如果您使用此快速修复,您会发现Eclipse(Mars)为createBodyprocessParameters生成存根。

然而,如果您删除processParameters存根,代码将可以编译通过(这是预期的,因为processParameters方法是一个默认方法)。

我在Eclipse bug跟踪器中找到了两个与此相关的bug报告(bug 409520bug 476517)。最新的(bug 476517)已经“已解决”并将在下一个版本的Eclipse(Neon)中发布。


https://bugs.eclipse.org/476517 最近已经修复,该修复仅在Eclipse 4.6 M2及以后版本(Neon的第二个里程碑)中可用。在最近的开发构建中,快速修复不再创建不必要的覆盖。 - Stephan Herrmann
@StephanHerrmann 您是正确的,我没有注意到,我会更新我的答案。 - Tunaki

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接