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

2022-09-04 01:56:46

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

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

public interface Derived extends Base {
}

它旨在将方法从接口移动到接口:FooBaseDerived

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

public interface Derived extends Base {
    void Foo();
}

为了逐步进行此重大更改,希望在一段时间内保持接口的向后兼容性。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(); 
}

当我编译此代码时,我收到派生型编译器警告:

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

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

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


警告似乎传达了“正在使用”(已弃用)的信息。但是,“使用”已弃用的唯一容量是覆盖它。这似乎表明您不允许在派生方法中重写已弃用的接口方法。Derived.FooBase.FooDerived.FooBase.Foo

如果是这种情况,那么我应该装饰以抑制警告吗?Derived@SuppressWarnings("deprecation")


答案 1

我相信您的要求是有效的,我毫不怀疑覆盖已弃用的方法是正确的方法。

我相信@deprecated和@Deprecated之间的区别主要是历史性的。@Deprecated是java 5中的官方方式,但是是新的,因此我们预计@deprecated将其加倍。

另请注意,可悲的是,@Deprecated不允许您指定信息。虽然通常需要信息,例如告诉应该将什么用作替换,或者何时预计完全删除已弃用的方法。

不知道更多,并且知道一旦你有效地删除了超级方法,问题就会消失,我会使用@SuppressWarnings(“deprecation”),可能带有注释,以便您的继任者理解...(以及对超级方法的另一条评论,告诉他们在删除方法时删除所有这些内容)。;-)


答案 2

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

public interface Derived extends Base {
    @Deprecated void Foo(); 
}