Enum: cosa significa?

25 views
Skip to first unread message

Davide

unread,
Jan 6, 2012, 3:46:11 AM1/6/12
to jugtaa
Ciao,

stavo guardando la definizione della classe java.lang.Enum:

Class Enum<E extends Enum<E>>

Che cosa e' questa cosa? Mi sembra un rompicapo ricorsivo ;-)


--
  _|  _.    o  _|  _
 (_| (_| \/ | (_| (/_

Simone Bordet

unread,
Jan 6, 2012, 6:36:49 AM1/6/12
to jug...@googlegroups.com
Ciao,

On Fri, Jan 6, 2012 at 09:46, Davide <d...@vide.bz> wrote:
> Ciao,
>
> stavo guardando la definizione della classe java.lang.Enum:
>
> Class Enum<E extends Enum<E>>
>
> Che cosa e' questa cosa? Mi sembra un rompicapo ricorsivo ;-)

E' un modo per far sì che una classe base, in questo case Enum, possa
riferirsi tramite un type parameter, in questo caso E, a una classe
derivata, nelle signature di metodi.

Quando il compilatore genera un enum, la classe diventa (circa):

public class Suit extends Enum<Suit>
{
// spade, diamond, club, hearts
}

Nota come Enum<Suit> ha la classe base, Enum, che prende come type
parameter la classe derivata, Suit.

Per chiarire meglio l'esempio delle signature dei metodi, prendiamo

class Animal<M extends Animal<M>>
{
public void mateWith(M mate) { ... }
}

Se non avessimo la definizione ricorsiva del type parameter, quando
estendiamo Animal avremmo:

class Dog extends Animal
{
public void mateWith(Animal mate) { ... }
}

cioè non riusciamo a dire che i Dog devono accoppiarsi solo con altri
Dog, ma con Animal, che non va bene.

Se rendiamo la classe parametrica, ma senza la ricorsione:

class Animal<T extends Animal> { ... }

allora sarebbe lecito scrivere:

class Dog extends Animal<Cat>
{
public void mateWith(Cat mate) { ... }
}

che neanche va bene.

Invece con la versione ricorsiva, siamo obbligati dal compilatore a scrivere:

class Dog extends Animal<Dog>
{
public void mateWith(Dog mate) { ... }
}

che è quello che vogliamo.

Nota che non è neanche necessario fare l'override di mateWith(): la
classe base lo definisce già nel modo corretto grazie al type
parameter ricorsivo (cioè la classe base può fare riferimento ad una
classe derivata!).

In generale, classi che hanno metodi che devono avere come parametro o
valore di ritorno la classe stessa possono beneficiare di questa
tecnica.

Per la discussione completa sui generics, vedi:
http://www.angelikalanger.com/GenericsFAQ/JavaGenericsFAQ.html, e in
particolare per la tua domanda:
http://www.angelikalanger.com/GenericsFAQ/FAQSections/TypeParameters.html#How%20do%20I%20decrypt%20Enum?

Simon
--
http://cometd.org
http://intalio.com
http://bordet.blogspot.com
----
Finally, no matter how good the architecture and design are,
to deliver bug-free software with optimal performance and reliability,
the implementation technique must be flawless.   Victoria Livschitz

Davide

unread,
Jan 8, 2012, 8:12:15 AM1/8/12
to jug...@googlegroups.com
Il 06 gennaio 2012 12:36, Simone Bordet <sbo...@intalio.com> ha scritto:
> Ciao,
>

Ciao,

ma ho notato pero' questa cosa.

Se io ho 2 enum:

Colori {bianco, nero, giallo ...}

Stato {aperto, chiuso, inlavorazione}

esiste una tipo che a cui posso assegnare sia una che l'altra?:

Tipo var1 = Colori; // o Stato?

Il l'unica cosa che ho trovato possibile e':

Enum[] var1 = Colori.values();

...

Simone Bordet

unread,
Jan 8, 2012, 8:50:59 AM1/8/12
to jug...@googlegroups.com
Ciao,

Esatto.

Reply all
Reply to author
Forward
0 new messages