Il seguente codice utilizza il concetto di metodo che esegue l'override in Java.Tipo di ritorno covariant in 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);
}
}
}
Per convenzione, il metodo predominante utilizza la stessa firma (con tipo di ritorno) sia nella classe di super e sottoclasse. Nel codice sopra riportato, il tipo restituito del metodo getList()
nello SuperClass
è List
e nella sottoclasse il tipo restituito è ArrayList
. Come funziona l'override del metodo qui?
A proposito, è ovvio che ArrayList
è un'implementazione dell'interfaccia List
, ma come si fa il compilatore trattare il tipo di ritorno qui mentre l'override del metodo getList()
?
Devo credere a qualcosa di simile ... Il tipo di ritorno del metodo sottoposto a override può essere un sottotipo del tipo di ritorno del metodo sottoposto a override.
Non sembra esserci una buona ragione per dichiarare 'SubClass.list' come' list' (piuttosto che un 'ArrayList'). –
@ MichaelBrewer-Davis - Potrebbe rendere le cose più belle quando stai usando 'SubClass' direttamente invece di trattarlo come un' SuperClass'. –
@Brendan - Stavo parlando della variabile membro (privata) che è troppo generica, non del metodo troppo specifico. La covarianza nel metodo è il sole e le farfalle. –