Considérese la siguiente jerarquía interfaz inheritence simplificado:Java: ¿Cómo evitar las advertencias obsoletas en las interfaces derivadas que anulan los miembros obsoletos?
// Starting point:
public interface Base {
void Foo();
}
public interface Derived extends Base {
}
Se pretende mover el método Foo
desde la interfaz de Base
a la interfaz Derived
:
// Desired end-point:
public interface Base {
}
public interface Derived extends Base {
void Foo();
}
Con el fin de fase en este cambio de última hora, se desea conservar la compatibilidad con versiones anteriores de la interfaz Base
durante algún tiempo.
Esto se puede lograr marcando el método en la interfaz Base
como @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();
}
Cuando compilar este código recibo una advertencia del compilador para Derived
:
[deprecation] Foo() en la interfaz Base ha quedado en desuso
Curiosamente, si elimino el @deprecated
de la documentación en Base
(pero dejo el @Deprecated) esta advertencia desaparece.
¿Es correcto que reciba esta advertencia y, de ser así, cómo puedo evitar esto?
La advertencia parece comunicar que Derived.Foo
es "usar" Base.Foo
(que está en desuso). Pero la única capacidad en la que Derived.Foo
está "usando" el Base.Foo
obsoleto es anularlo. Eso parece decir que no se te permite anular los métodos de interfaz en desuso en los métodos derivados.
Si este es el caso, ¿debo decorar Derived
con para suprimir la advertencia?
¿Qué versión de Java estás usando? Me parece recordar que esto fue considerado un error en algún momento, posiblemente arreglado ... pero no puedo estar seguro de recordar esto correctamente. He visto exactamente lo que quieres decir. –