Рассмотрим следующую упрощенную иерархию наследования интерфейсов:
// 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:
[усталость] Foo() в интерфейсе Base устарела
Как ни странно, если я удалю @Deprecated из документации в Base (но оставьте @Deprecated), это предупреждение исчезнет.
Правильно ли, что я получаю это предупреждение, и если да, то как я могу обойти это?
Предупреждение, кажется, сообщает, что Derived.Foo "использует" Base.Foo (который устарел). Но единственной способностью, в которой Derived.Foo является "использование" устаревшего Base.Foo, является его переопределение. Это говорит о том, что вы не можете переопределить устаревшие методы интерфейса в производных методах.
Если это так, должен ли я затем украсить Derived @SuppressWarnings("deprecation"), чтобы пресечь предупреждение?