考虑以下简化的接口继承层次结构:
// 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")
以取消警告?
答案 0 :(得分:10)
我相信您的要求是有效的,我毫不怀疑重写弃用的方法是正确的方法。
我认为@deprecated和@Deprecated之间的差异主要是历史性的。 @Deprecated是java 5中的官方方式,但是是新的,所以我们希望用@deprecated加倍。
还要注意,遗憾的是,@ Deprecated不允许您指定信息..虽然通常需要信息,例如告诉应该使用什么作为替换,或者预期弃用的方法被完全删除
不知道更多,知道问题会在你有效删除超级方法后立即消失,我会使用@SuppressWarnings(“弃用”),可能会对你的继任者的评论有所了解......(和另一个评论超级方法,告诉他们在删除方法时删除所有内容)。 ; - )
答案 1 :(得分:3)
如果我理解正确,你需要在类的开头实现不推荐的接口/函数的@SuppressWarnings(“弃用”)。还是我离开基地?
答案 2 :(得分:3)
如果你将@Deprecated添加到派生的Foo()声明中,我相信警告会消失。
public interface Derived extends Base {
@Deprecated void Foo();
}
答案 3 :(得分:-1)
没有办法实现你想要的。
弃用是一种相对简单的机制,不支持此用例。
弃用的方式是引用已弃用的方法或字段的任何内容都会生成警告。
唯一的例外是如果不推荐使用弃用的方法/字段的代码。