Dan*_*nov 12 java overriding interface deprecated
请考虑以下简化的接口继承层次结构:
// Starting point:
public interface Base {
void Foo();
}
public interface Derived extends Base {
}
Run Code Online (Sandbox Code Playgroud)
它旨在将Foo方法从Base接口移动到Derived接口:
// Desired end-point:
public interface Base {
}
public interface Derived extends Base {
void Foo();
}
Run Code Online (Sandbox Code Playgroud)
为了逐步实现这种突破性改变,希望在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();
}
Run Code Online (Sandbox Code Playgroud)
当我编译此代码时,我收到编译器警告Derived:
[弃用]接口Base中的Foo()已被弃用
奇怪的是,如果我@deprecated从文档中删除Base(但保留@Deprecated),此警告将消失.
我得到这个警告是否正确,如果是这样,我该如何解决这个问题呢?
警告似乎传达的Derived.Foo是"使用" Base.Foo(已弃用).但是,Derived.Foo"使用"已弃用的唯一容量Base.Foo是覆盖它.这似乎表明您不允许在派生方法中覆盖已弃用的接口方法.
如果是这样的话,我应该再装饰Derived用@SuppressWarnings("deprecation")相应的警告?
KLE*_*KLE 11
我相信您的要求是有效的,我毫不怀疑重写弃用的方法是正确的方法.
我相信@deprecated和@Deprecated之间的区别主要是历史性的.@Deprecated是java 5中的官方方式,但是是新的,所以我们希望用@deprecated加倍.
还要注意,遗憾的是,@ Deprecated不允许您指定信息..虽然通常需要信息,例如告诉应该使用什么作为替换,或者预期已弃用的方法被完全删除.
不知道更多,知道问题会在你有效删除超级方法后立即消失,我会使用@SuppressWarnings("弃用"),可能会对你的继任者的评论有所了解......(以及另一条评论告诉他们在删除方法时删除所有内容的超级方法).;-)
如果您将 @Deprecated 添加到 Foo() 的派生声明中,我相信警告将会消失。
public interface Derived extends Base {
@Deprecated void Foo();
}
Run Code Online (Sandbox Code Playgroud)