Подтвердить что ты не робот

Java: Как избежать устаревшего предупреждения в производных интерфейсах, которые переопределяют устаревшие элементы?

Рассмотрим следующую упрощенную иерархию наследования интерфейсов:

// 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"), чтобы пресечь предупреждение?

4b9b3361

Ответ 1

Я считаю, что ваше требование действительно, я не сомневаюсь, что отменять устаревший метод - это правильный путь.

Я считаю, что разница между @deprecated и @Deprecated в основном историческая. @Deprecated является официальным способом в java 5, но является новым, поэтому мы должны удвоить его с помощью @deprecated.

Также обратите внимание, что, к сожалению, @Deprecated не позволяет вам указывать информацию.. в то время как информация обычно необходима, например, чтобы сообщить, что следует использовать в качестве замены, или когда ожидается, что устаревший метод будет полностью удален.

Не зная больше, и знание проблемы исчезнет, ​​как только вы удалите супер метод, я бы использовал @SuppressWarnings ( "derecation" ), возможно, с комментарием для ваших преемников, чтобы понять... (и другое комментарий супер-метода, чтобы сказать им удалить все это при удалении метода).; -)

Ответ 2

Если вы добавите @Deprecated в свою производную декларацию Foo(), я верю, что предупреждение исчезнет.

public interface Derived extends Base {
    @Deprecated void Foo(); 
}

Ответ 3

Если я правильно понял, вам нужно @SuppressWarnings ( "derecation" ) в начале ваших классов, которые реализуют устаревший интерфейс/функцию. Или я здесь отсюда?

Ответ 4

Невозможно выполнить то, что вы хотите.

Отсрочка - относительно простой механизм и не поддерживает этот прецедент.

Как работает эта усталость, все, что ссылается на устаревший метод или поле, генерирует предупреждение.

Единственным исключением является то, что код, использующий устаревшее метод/поле, устарел.