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