Sto studiando i tipi generici e mi sono bloccato nella comprensione di un esempio.
Il manuale cita questo esempio:
codice:
interface Cibo
{
String getColore();
}
codice:
interface Animale
{
void mangia(Cibo cibo) throws CiboException
}
codice:
public class Erba implements Cibo
{
public String getColore()
{
return "verde";
}
}
codice:
public class Carnivoro implements Animale
{
public void mangia(Cibo cibo) throws CiboException
{
if(!(cibo instanceof Erbivoro)
{
throw new CiboException("Un carnivoro deve mangiare " + "erbivori");
}
}
}
codice:
public class Erbivoro implements Cibo, Animale
{
public void mangia(Cibo cibo) throws CiboException
{
if(!(cibo instanceof Erba)
{
throw new CiboException("Un erbivoro deve mangiare " + "erba");
}
}
public String getColore()
{
...
}
}
codice:
public class CiboException extends Exception
{
public CiboException(String msg)
{
super(msg);
}
}
codice:
public class TestAnimali
{
public static void main(String args[])
{
try
{
Animale tigre = new Carnivoro();
Cibo erba = new Erba();
tigre.mangia(erba);
}
catch(CiboException exc)
{
exc.printStackTrace();
}
}
}
Questa soluzione è valida però il manuale, per evitare la gestione delle eccezioni, ne propone un'altra utilizzando i tipi parametro:
codice:
interface Cibo
{
String getColore();
}
codice:
interface Animale<C extends Cibo>
{
void mangia(C cibo)
}
codice:
public class Erba implements Cibo
{
public String getColore()
{
return "verde";
}
}
codice:
public class Carnivoro implements Animale<Erbivoro>
{
public void mangia(Erbivoro erbivoro)
{
// un carnivoro potrebbe mangiare erbivori
}
}
codice:
public class Erbivoro<E extends Erba> implements Cibo, Animale<E>
{
public void mangia(E erba)
{
// un erbivoro mangia erba
}
public String getColore()
{
...
}
}
codice:
public class TestAnimali
{
public static void main(String args[])
{
Animale<Erbivoro> tigre = new Carnivoro<Erbivoro>();
Erbivoro<Erba> erbivoro = new Erba<Erba>();
tigre.mangia(erbivoro);
}
}
Il problema è che non ho capito nell'ultima soluzione come ha utilizzato i tipi parametro, mi sfuggono proprio i vari passaggi nel codice.
Potete aiutarmi nella comprensione?