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

// 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()已被弃用

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

我收到此警告是否正确,如果是,我该如何处理?


警告似乎表明 Derived.Foo 是“正在使用” Base.Foo (不推荐使用)。但 Derived.Foo 的唯一容量是“使用”不推荐使用的 Base.Foo 将覆盖它。这似乎表明您不允许在派生方法中覆盖已弃用的接口方法。

如果是这种情况,我是否应该用 @SuppressWarnings(" deprecation")修饰 Derived 以取消警告?

有帮助吗?

解决方案

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

我认为@deprecated和@Deprecated之间的差异主要是历史性的。 @Deprecated是java 5中的官方方式,但是是新的,所以我们希望用@deprecated加倍。

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

不知道更多,并且一旦你有效地删除了超级方法,知道问题就会消失,我会使用@SuppressWarnings(“弃用”),可能会对你的继任者的评论有所了解......(和关于超级方法的另一个评论,告诉他们在删除方法时删除所有内容)。 ; - )

其他提示

如果我理解正确,您需要在类的开头实现不推荐的接口/函数的@SuppressWarnings(“弃用”)。还是我离开基地?

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

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

没有办法实现你想要的。

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

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

唯一的例外是如果不推荐使用弃用的方法/字段的代码。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top