13

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

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

public interface Derived extends Base {
}

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

// 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(); 
}

当我编译这段代码时,我收到一个编译器警告Derived

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

奇怪的是,如果我@deprecated从文档中删除Base(但留下@Deprecated),这个警告就会消失。

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


该警告似乎传达的Derived.Foo是“使用” Base.Foo(已弃用)。Derived.Foo但是“使用”已弃用的唯一能力Base.Foo是覆盖它。这似乎是说您不允许在派生方法中覆盖已弃用的接口方法。

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

4

4 回答 4

13

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

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

另请注意,可悲的是,@Deprecated 不允许您指定信息 .. 而通常需要信息,例如说明应该使用什么作为替代,或者何时预计完全删除不推荐使用的方法。

不知道更多,并且知道一旦您有效删除超级方法,问题就会消失,我会使用@SuppressWarnings("deprecation"),可能带有评论让您的继任者理解......(以及关于超级方法告诉他们在删除方法时删除所有这些)。;-)

于 2009-08-01T15:30:02.133 回答
3

如果我理解正确,您需要在实现已弃用的接口/功能的类的开头使用 @SuppressWarnings("deprecation") 。还是我离这里很远?

于 2009-07-31T15:58:08.543 回答
3

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

public interface Derived extends Base {
    @Deprecated void Foo(); 
}
于 2016-02-03T23:23:14.103 回答
-1

没有办法完成你想要的。

弃用是一种相对简单的机制,不支持这种用例。

弃用的工作方式是任何引用弃用的方法或字段的内容都会生成警告。

唯一的例外是,如果使用已弃用的方法/字段的代码本身已被弃用。

于 2009-08-04T14:33:58.533 回答