Java:如何避免派生接口中的弃用警告覆盖不推荐使用的成员?

Dan*_*nov 12 java overriding interface deprecated

请考虑以下简化的接口继承层次结构:

// Starting point:
public interface Base {
    void Foo();
}

public interface Derived extends Base {
}
Run Code Online (Sandbox Code Playgroud)

它旨在将Foo方法从Base接口移动到Derived接口:

// Desired end-point:
public interface Base {
}

public interface Derived extends Base {
    void Foo();
}
Run Code Online (Sandbox Code Playgroud)

为了逐步实现这种突破性改变,希望在Base一段时间内保持接口的向后兼容性.

这可以通过将Base接口上的方法标记为@Deprecated:

// Intermediate state:
public interface Base {
    /**
     * @deprecated This method is deprecated as of release X. Derived.Foo should be used instead.
     */
    @Deprecated void Foo();
}

public interface Derived extends Base {
    void Foo(); 
}
Run Code Online (Sandbox Code Playgroud)

当我编译此代码时,我收到编译器警告Derived:

[弃用]接口Base中的Foo()已被弃用

奇怪的是,如果我@deprecated从文档中删除Base(但保留@Deprecated),此警告将消失.

我得到这个警告是否正确,如果是这样,我该如何解决这个问题呢?


警告似乎传达的Derived.Foo是"使用" Base.Foo(已弃用).但是,Derived.Foo"使用"已弃用的唯一容量Base.Foo是覆盖它.这似乎表明您不允许在派生方法中覆盖已弃用的接口方法.

如果是这样的话,我应该再装饰Derived@SuppressWarnings("deprecation")相应的警告?

KLE*_*KLE 11

我相信您的要求是有效的,我毫不怀疑重写弃用的方法是正确的方法.

我相信@deprecated和@Deprecated之间的区别主要是历史性的.@Deprecated是java 5中的官方方式,但是是新的,所以我们希望用@deprecated加倍.

还要注意,遗憾的是,@ Deprecated不允许您指定信息..虽然通常需要信息,例如告诉应该使用什么作为替换,或者预期已弃用的方法被完全删除.

不知道更多,知道问题会在你有效删除超级方法后立即消失,我会使用@SuppressWarnings("弃用"),可能会对你的继任者的评论有所了解......(以及另一条评论告诉他们在删除方法时删除所有内容的超级方法).;-)


Rav*_*ven 7

如果您将 @Deprecated 添加到 Foo() 的派生声明中,我相信警告将会消失。

public interface Derived extends Base {
    @Deprecated void Foo(); 
}
Run Code Online (Sandbox Code Playgroud)