PDA

View Full Version : [java] che significa il simbolo <E>


Prince_81
28-03-2010, 16:37
spesso trovo interfacce o classi scritte in questo modo public interface SortedSet<E> extends Set<E> mi sapreste dire quelle lettere tra i simboli minore e maggiore che stanno a significare?

nuovoUtente86
28-03-2010, 16:44
viene utilizzato il meccanismo dei generics: http://java.sun.com/j2se/1.5.0/docs/guide/language/generics.html

lupoxxx87
28-03-2010, 17:47
spesso trovo interfacce o classi scritte in questo modo public interface SortedSet<E> extends Set<E> mi sapreste dire quelle lettere tra i simboli minore e maggiore che stanno a significare?

:eek: OMMIODDIO :eek:

PGI-Bis
28-03-2010, 18:10
:eek: OMMIODDIO :eek:

Ommioddio che? Che è stato? Co fu?

cdimauro
28-03-2010, 19:02
E' colpa sua:

http://upload.wikimedia.org/wikipedia/commons/0/00/James_Gosling_2005.jpg

:O

PGI-Bis
28-03-2010, 19:03
No, è colpa sua:

http://bracha.org/Site/Home.html

MaxArt
28-03-2010, 19:06
Ragazzi, in pratica vi sta chiedendo di spiegare in parole semplici cosa sono i generics, a che servono e perché sono stati introdotti :) Non è proprio un concetto immediatissimo...
Io non mi cimento perché ci ho avuto poco a che fare e piuttosto preferirei imparare da uno che li conosce più a fondo, però, orsù! :D

cdimauro
28-03-2010, 20:29
No, è colpa sua:

http://bracha.org/Site/Home.html
Compagno di merende? :fiufiu:

x MaxArt: i generic sono il male. Per maggiori informazioni, chiedi a PGIBis. :fagiano:

MaxArt
28-03-2010, 22:18
x MaxArt: i generic sono il male. Per maggiori informazioni, chiedi a PGIBis. :fagiano:"Sono il male", lol :asd: Chissà perché una frase del genere da te... me l'aspettavo senza dubbio! :D
No, per me, o meglio per quanto li ho usati, i generics sono per lo più una rottura di balle. A questo punto, però, vorrei sapere da te perché li consideri una cosa cattiva.

E chi è PGIBis? :fagiano:

Gelert
28-03-2010, 23:27
i generics sono un modo per creare strutture che si possono adeguare al tipo di dati.

per esempio i set sono tipi generici (cioè come tu l'hai fatto vedere è dichiarato come Set<E>)

nel momento in cui tu dichiari un istanza di un set puoi specificare di che tipo è il set:

Set<Object> s1 = new Set<Object> ();
Set<Punto> s2 = new Set<Punto> ();
Set<Triangolo> s3 = new Set<Triangolo> ();

s1 avrà Object come tipo di dati nel set
s2 avrà Punti
s3 avrà Triangoli

se tu fai s3.add(new Punto) non compilerà in quanto s3 è accetta solo quello che è triangolo (supponendo che la classe Punto non estenda la classe triangolo)

invece puoi fare s3.add(new Triangolo)

la differenza vera la vedi nel momento in cui devi estrarre i dati dal Set in quanto in s2 ti vengono restituiti direttamente come Punto (senza i generics ti vengono restituiti come Object e devi fare il cast a punto) e in s3 ti verranno restituiti come Triangolo.

il problema è nello scrivere la classe Set<E> che diventa un pò delicato per alcune questioni dei Generics, all'interno della classe dovrai riferirti al tipo E per indicare il tipo che verrà stabilito dai generics.

inoltre puoi impostare delle regole per i tipi generics (per esempio obbligare ad estendere una certa classe), oppure puoi dichiarare generici rispetto a più tipi (come le Map che sono generiche rispetto a due tipi, uno la chiave l'altro il valore).

se tu istanzi un Set senza specificare il tipo puoi assumere di aver dichiarato un Object anche se questa è una grande semplificazione e anche scorretta.

Prince_81
29-03-2010, 08:36
Gelert sei stato molto esaustivo,adesso devo trovare un buon libro java perchè nel mio non c'è questo argomento.

vladix
29-03-2010, 08:48
non e molto ma puoi iniziare da qui (http://java.sun.com/docs/books/tutorial/java/generics/index.html)

i generic sono il male. Per maggiori informazioni, chiedi a PGIBis. :fagiano: perchè non ci illumini ? :O

astorcas
29-03-2010, 09:12
boh sarò limitato ma tutto sto male non ce lo vedo io.... :mbe:

cdimauro
29-03-2010, 09:15
Guardate che io non ho nulla contro i generic (a parte la loro ORRIBILE sintassi).

Purtroppo non sono riuscito a recuperare un messaggio di PGI-Bis in cui parlava proprio di questo strumento (del demonio :D) dal punto di vista di un "purista" di Java.

A parte questo, l'implementazione Java non è esente da difetti (http://www.artima.com/intv/generics.html).

WarDuck
29-03-2010, 10:17
I generics servono ad evitare boxing ed unboxing principalmente, e dunque sul piano prestazionale consentono di avere un efficienza maggiore.

La sintassi è una questione soggettiva, ma devo dire che anche a me non è che mi facciano impazzire (soprattutto se volessi creare strutture "ricorsive").

Tra l'altro mi piacerebbe sapere cosa succede in questi due casi:

Classe<T> prova = new Classe<T>();
Classe<T> prova = new Classe();

A quanto ho visto sono due sintassi equivalenti (NetBeans non lo segnala come errore, ad Eclipse da fastidio).

Parlando di sintassi spero vivamente che JDK7 implementi l'inferenza dei tipi a tempo di compilazione (in modo simile a C#), ad esempio:

var prova = new Classe<T>();

tomminno
29-03-2010, 10:59
Compagno di merende? :fiufiu:

x MaxArt: i generic sono il male. Per maggiori informazioni, chiedi a PGIBis. :fagiano:

Quandi andiamo avanti a forza di liste di object?
Che poi in java sotto sotto sia comunque così è un altro discorso.

cdimauro
29-03-2010, 13:07
Parli con uno che i generic in Java li ha usati, quando sono serviti, turandosi il naso per la sintassi lunga e criptica.

Il problema non è tanto il mio (che non lavoro più in Java, tra l'altro), ma dei "puristi". ;)

banryu79
29-03-2010, 16:54
@Prince_81:
Qua [Angelika Langer - Generics FAQ] (http://www.angelikalanger.com/GenericsFAQ/JavaGenericsFAQ.html) trovi di tutto e di più sui Generics in Java.
Roba da :coffee:, sei avvisato.

astorcas
29-03-2010, 17:13
@Prince_81:
Qua [Angelika Langer - Generics FAQ] (http://www.angelikalanger.com/GenericsFAQ/JavaGenericsFAQ.html) trovi di tutto e di più sui Generics in Java.
Roba da :coffee:, sei avvisato.

Non conosco i Generics in Java così a fondo da vedere le differenze col C#. Quindi sono quelli in Java ad essere il male? L'implementazione in C# è yeah? E che mi dite di C++? (tanto per mettere un po' di carne al fuoco :D)

cdimauro
29-03-2010, 19:33
A me non piacciono già i linguaggi con sintassi C-like, e il C++ che aggiunge cripticità alla sintassi (specialmente coi template) non fa che peggiorare le cose. :D

Ma è una questione di gusti, sia chiaro. Le funzionalità esposte da un linguaggio, tolta di mezzo la sintassi, non vanno cestinate oppure osteggiate per partito preso.

Certo, in alcuni casi fanno a pugni con la teoria (se non ricordo male PGI-Bis poneva il problema della varianza e/o controvarianza introdotta dai generic; sfortunatamente non ricordo i termini della questione; il messaggio che scrisse esponeva in maniera precisa e rigorosa i termini della questione, ma non sono riuscito a rintracciarlo), ma da programmatore devo necessariamente essere pragmatico e "turarmi il caso", come dicevo prima, se qualcosa la devo usare anche se non mi piace (d'altra parte la notte, quando posso, lavoro in C, per cui ho la mia buona dose di autofustigazione :D).

Per quanto riguarda l'implementazione dei generic in Java, il link che ho postato prima espone il concetto di generic e l'implementazione di C# e Java, descrivendo i pregi e i difetti. Consiglio a tutti di leggerlo, perché è molto interessante.

franksisca
30-03-2010, 10:19
sono contro i generics per il semplice motivo che andiamo a "femmine di malaffare" tutti i concetti sulla generalità degli oggetti.


perchè creare 3 liste di oggetti specifici se posso crearne 1 generica?

tomminno
30-03-2010, 10:55
Certo, in alcuni casi fanno a pugni con la teoria (se non ricordo male PGI-Bis poneva il problema della varianza e/o controvarianza introdotta dai generic; sfortunatamente non ricordo i termini della questione; il messaggio che scrisse esponeva in maniera precisa e rigorosa i termini della questione, ma non sono riuscito a rintracciarlo), ma da programmatore devo necessariamente essere pragmatico e "turarmi il caso", come dicevo prima, se qualcosa la devo usare anche se non mi piace (d'altra parte la notte, quando posso, lavoro in C, per cui ho la mia buona dose di autofustigazione :D).


Bisogna anche pensare che in linguaggi tipizzati i generics/template servono come il pane per la creazione di contenitori di oggetti.
Non credo ci sia di che turarsi il naso a scrivere List<String> o vector<string>.
Secondo me c'è da turarsi il naso ad usare array di oggetti piuttosto che il contenitore generico messo a disposizione dal linguaggio di turno.

cdimauro
30-03-2010, 11:10
Per me si tratta di una questione di gusti, come dicevo prima: la funzionalità di per sé a me piace e la uso.

astorcas
30-03-2010, 12:02
sono contro i generics per il semplice motivo che andiamo a "femmine di malaffare" tutti i concetti sulla generalità degli oggetti.


perchè creare 3 liste di oggetti specifici se posso crearne 1 generica?

:confused: :confused: :confused:

WarDuck
30-03-2010, 12:22
sono contro i generics per il semplice motivo che andiamo a "femmine di malaffare" tutti i concetti sulla generalità degli oggetti.


perchè creare 3 liste di oggetti specifici se posso crearne 1 generica?

Non sono per niente d'accordo.

Gli oggetti non sono tutti uguali ma soprattutto la "generalità" di cui parli è utile solo se gli oggetti hanno caratteristiche in comune.

Altrimenti sembra quasi che tutto il paradigma ad oggetti si possa fare con la sola classe Object :asd: .

Poi se te preferisci trovarti davanti a liste di Object vari che potrebbero non avere niente in comune...

Tra l'altro come dicevo prima c'è anche un motivo prestazionale alla base dei generics, evitando la costosa operazione di boxing ed unboxing.

Se vuoi generalizzare (o specializzare) una tua classe lo puoi fare tramite l'ereditarietà.

Inoltre nessuno ti obbliga ad usare i generics, se hai bisogno di una lista di Object puoi sempre farlo (anche se a mio modo di vedere non è consigliabile, per i motivi che ho detto prima).

banryu79
30-03-2010, 13:27
Io ho lavorato sia con che senza Generics.
Per me +1 ai Generics.
motivi, forse banali:
1] il controllo a compile time sulla correttezza dei tipi infilati dentro;
2] il codice che dichiara il tipo di oggetti nella collezione mi esplicita (in parte) l'uso/la ragione di quella collezione a colpo d'occhio.

Sul fatto che in Java siano stati introdotti a forza nel linguaggio con relativi connessi, beh, non è il massimo e pace.

Prince_81
04-04-2010, 18:30
banryu79 grazie ci darò un occhiata !!!!!!!!!!

gugoXX
04-04-2010, 22:22
sono contro i generics per il semplice motivo che andiamo a "femmine di malaffare" tutti i concetti sulla generalità degli oggetti.


perchè creare 3 liste di oggetti specifici se posso crearne 1 generica?

A parte la maggior efficienza nel caso in cui gli oggetti contenuti siano By Value invece che By Reference, I generics forzando la tipizzazione forte sulle collezioni premettono di scoprire molti problemi a compile time invece che a runtime