tagan ha scritto:
La sintassi :
interface Animale<C extends Cibo>{
e
class Erbivoro<E extends Erba> implements Cibo, Animale<E>{
significa : la parte in grassetto dell'implements, che Erbivoro "IS A" Cibo e Animale,
la parte in rosso invece cosa significa? forse, che quella classe accetta ed "elabora" oggetti di tipo <Classe> ? quindi Cido nell'interfaccia Animale e Erba e sottoclassi di Erba negli oggetti di tipo Erbivoro?
Una classe (tipo in generale, anche interfaccia) è "generica" quando introduce nella definizione una (o più)
type variable.
Quindi ad esempio:
public class Scatola<E> {
...
}
Scatola è generica poiché introduce la
type variable E. Con questa definizione di Scatola, puoi usarla parametrizzata con qualunque tipo concreto:
Scatola<String> s1 = new Scatola<>();
Scatola<Date> s2 = new Scatola<>();
Scatola<Rectangle> s3 = new Scatola<>();
ecc...
Se invece metti un
bound ("limite") sulla type variable, questo serve solo a limitare i tipi che potranno essere usati per parametrizzare concretamente Scatola.
public class Scatola<E extends Number> {
...
}
allora:
Scatola<Integer> s4 = new Scatola<>(); // ok
Scatola<Double> s5 = new Scatola<>(); // ok
Scatola<Number> s6 = new Scatola<>(); // ok
Scatola<String> s7 = new Scatola<>(); // NOOOOO, errore
Scatola<Date> s8 = new Scatola<>(); // NOOOOO, errore
Pertanto Scatola lo puoi usare solo con parametrizzazioni che sono da Number (compreso) in giù nella gerarchia.
tagan ha scritto:
inoltre, quello che non ho capito: l'implements Animale<E> che funzione ha? di creare un "legame" tra interfaccia Animale e Erbivoro o cosa?
e per lo più questi'ultima parte che non capisco.
Facciamo lo scenario semplice:
class Erbivoro<E extends Erba> implements Animale<E> { ..... }
supponiamo che ci sia una classe Cicoria che deriva da Erba. Quindi se da qualche parte fai:
Erbivoro<Cicoria> coniglio = new Erbivoro<>();
Allora questo oggetto oltre ad essere un Erbivoro implementa (ed
è-un) Animale<
Cicoria>
Questo è il legame. Altrove potresti ad esempio fare:
Animale<Cicoria> animaleCheMangiaCicoria = coniglio;