Infatti questo esempio mi sta solo confondendo le idee, perché forse cosi riportato non c'è soluzione a quello che volevo. mi spisgo meglio e definitivamente:
come è fatto il programma nel libro:
- interfaccia Cibo
- Intefaccia Animale<Parametrizzata con Cibo>
- Classe Erba che implementa Cibo
- Classe Erbivoro che accetta solo Erba
- Classe Carnivoro che accetta solo Erbivoro, quindi:
......un Erbivoro mangia Erba
......un Carnivoro mangia Erbivoro MA NON Erba E NON Carnivoro.
La mia modifica era, tentare di "sbloccare" il vincolo su Carnivoro in moco che sia possibile:
un Carnivoro maniga Erbivoro E mangia Carnivoro MA NON mangia Erba
il codice originale con tutti i suggerimento che hai dato (e eliminano tutti gli warning) e che nel libro non ci sono è questo:
interface Cibo{}
interface Animale<C extends Cibo>{
void mangia(C cibo);
}
class Erba implements Cibo{}
class Erbivoro<E extends Erba> implements Cibo, Animale<E>{
public void mangia(E erba) {
System.out.println("Erbivoro mangia Erba");
}
}
class Carnivoro<E extends Erbivoro<Erba>> implements Animale<E>{
public void mangia(E cibo) {
System.out.println("Carnivoro mangia Erbivoro");
}
}
public class TesterGeneric {
public static void main(String[] args) {
Erba erba = new Erba();
Erbivoro<Erba> mucca = new Erbivoro<>();
Carnivoro<Erbivoro<Erba>> tigre = new Carnivoro<>();
System.out.print("Mucca: "); mucca.mangia(erba);
System.out.print("Tigre: "); tigre.mangia(mucca);
//aggiunto da me
Carnivoro<Erbivoro<Erba>> leone = new Carnivoro<>();
System.out.print("Leone: "); leone.mangia(tigre);
}
}
le ultime die righe le ho aggiunte io ma ovviamente non compilano per come è scritta la classe Carnivoro, classe che ho tentato di modificare invano.
se eseguo, restituisce su
leone.mangia(tigre);
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
The method mangia(Erbivoro<Erba>) in the type Carnivoro<Erbivoro<Erba>> is not applicable for the arguments (Carnivoro<Erbivoro<Erba>>)
Il problema è che (...penso..!) se modifico Carnivoro come
class Carnivoro implements Animale<Cibo> {
public void mangia(Cibo cibo) {
ad una tigre riesco a far mangiare anche l'erba.
Volevo evitare questa cosa con i generici senza scrivere un test del tipo
instanceof e implementare delle eccezioni.
Grazie.
Non so se ci sia soluzione o se è da riscrivere tutto.
cmq ora mi sto esercitando sui thread e a breve chiederò un consiglio anche su un altro esercizio che sto facendo e ho trovato su una dispensa dell'università di pisa.
Tagan