Рассмотрим следующую упрощенную иерархию наследования интерфейсов:
// 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")
, чтобы пресечь предупреждение?