Precisazione sui Generici

di il
2 risposte

Precisazione sui Generici

Ciao.
in linea generale ho capito cosa sono i generici ...classe, metodi...ecc. chiedo però se qualcuno può spiegarmi questo che forse ancora non ho appreso bene.
(riprendo l'esempio del libro perché non mi va di inventarmi qualcos'altro)
premessa, visto il codice

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) {
		................
	}
}
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?

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.

Lo chiedo perché in azienda ho visto un po di codice nei progetti java e ne fanno uso, ma i colleghi hanno la capacità di spiegazione di un muto!

Grazie.
Tagan

2 Risposte

  • Re: Precisazione sui Generici

    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;
  • Re: Precisazione sui Generici

    Perfetto.
    capito tutto, grazie mille. sempre gentilissimo.
    Ciao
    Tagan
Devi accedere o registrarti per scrivere nel forum
2 risposte