consideri il seguente gerarchia interfaccia inheritence semplificata:Java: come evitare l'avviso deprecato nelle interfacce derivate che sovrascrivono i membri deprecati?
// Starting point:
public interface Base {
void Foo();
}
public interface Derived extends Base {
}
Si intende spostare il metodo Foo
dall'interfaccia Base
all'interfaccia Derived
:
// Desired end-point:
public interface Base {
}
public interface Derived extends Base {
void Foo();
}
Per fase in questo cambiamento di rottura, si desidera mantenere la compatibilità all'indietro dell'interfaccia Base
per un po 'di tempo.
Ciò può essere ottenuto marcando il metodo sull'interfaccia Base
come @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();
}
Quando compilo questo codice ricevo un avviso del compilatore per Derived
:
[deprecazione] Foo() nell'interfaccia La base è stata deprecata
Stranamente, se rimuovo lo @deprecated
dalla documentazione in Base
(ma lascia il @Deprecated) questo avviso scompare.
È corretto che venga visualizzato questo avviso e, in caso affermativo, come posso risolvere il problema?
L'avvertimento sembra comunicare che Derived.Foo
sta "utilizzando" Base.Foo
(che è deprecato). Ma l'unica capacità in cui Derived.Foo
"sta usando" il deprecato Base.Foo
è di sovrascriverlo. Ciò sembra dire che non è consentito sovrascrivere i metodi di interfaccia deprecati nei metodi derivati.
Se questo è il caso, dovrei quindi decorare Derived
con @SuppressWarnings("deprecation")
per sopprimere l'avviso?
Quale versione di Java stai utilizzando? Mi sembra di ricordare che a un certo punto è stato considerato un bug, probabilmente risolto ... ma non posso essere sicuro di averlo ricordato correttamente. Ho visto esattamente cosa intendi. –