Java:如何避免派生接口中的弃用警告覆盖不推荐使用的成员?
-
06-07-2019 - |
题
考虑以下简化的接口继承层次结构:
// 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();
}
没有办法实现你想要的。
弃用是一种相对简单的机制,不支持此用例。
弃用的方式是引用已弃用的方法或字段的任何内容都会生成警告。
唯一的例外是如果不推荐使用弃用的方法/字段的代码。