El siguiente código utiliza el concepto de anulación de método en Java.Tipo de retorno covariante en Java
package pkg;
import java.util.ArrayList;
import java.util.List;
abstract class SuperClass
{
abstract public List<String>getList();
}
final class SubClass extends SuperClass
{
private List<String>list=null;
@Override
public ArrayList<String> getList()
{
list=new ArrayList<String>();
list.add("A");
list.add("B");
return (ArrayList<String>) list;
}
}
final public class Main
{
public static void main(String[] args)
{
SuperClass s=new SubClass();
List<String>list=s.getList();
for(String str:list)
{
System.out.println(str);
}
}
}
Por convención, el método predominante utiliza la misma firma (con tipo de retorno) tanto en super clase y subclase. En el código anterior, el tipo de devolución del método getList()
en el SuperClass
es List
y en su subclase el tipo de devolución es ArrayList
. ¿Cómo funciona el método de anulación aquí?
Por cierto, es obvio que ArrayList
es una implementación de la interfaz List
pero ¿Cómo trata el compilador el tipo de retorno aquí mientras reemplazando el método getList()
?
Debo creer algo como esto ... El tipo de devolución del método reemplazado puede ser un subtipo del tipo de devolución del método reemplazado.
No parece haber ninguna buena razón para declarar '' SubClass.list' como list' (en lugar de un 'ArrayList'). –
@ MichaelBrewer-Davis - Podría mejorar las cosas si usa 'SubClass' directamente en lugar de tratarlo como' SuperClass'. –
@Brendan - Estaba hablando de que la variable miembro (privada) es demasiado general, no el método demasiado específico. La covarianza en el método es sol y mariposas. –