PDA

Visualizza la versione completa : [Java] <E>, <T>, <K>... che robe sono?


LeleFT
25-10-2004, 18:42
Ciao a tutti. Oggi mi sono scontrato con una delle novità che Java ha messo a disposizione (cose che credo potessero risparmiarsi, dato che ora tutte le mia applicazioni perfettamente legali per JDK 1.4.2 non sono più compilabili in modo pulito per JDK 1.5.0).

Sono entrato nel sito della Sun, nella documentazione dopo che mi è apparso un misteriosissimo messaggio di Worning in fase di compilazione:
«[unchecked] unchecked call to add(E) as a member of the raw type java.util.Vector»
:oVVoVe: (mistero assoluto... che vorrà mai dire questa cosa??)

Andiamo avanti... entro nella documentazione della classe Vector (che fino alla versione 1.4.2 era un bellissima classe, semplicissima da usare, senza tanti problemi) e mi trovo qualcosa di orribile di fronte:


Class Vector<E>

java.lang.Object
|
+- java.util.AbstractCollection<E>
|
+--- java.util.AbstractList<E>
|
+------ java.util.Vector<E>
Altro mistero... che roba è quella <E> che fa tanto pensare ai template del C++?? :confused: Mah...

Ma la cosa non finisce qui: vado a vedere quei metodi che pensavo di conoscere a memoria... e, sorpresa delle sorprese, tutto cambiato! Ora il metodo add() non riceve più un paramtero di tipo Object (come sarebbe lecito aspettarsi, dopo anni di utilizzo di questa classe), ma accetta un argomento di un tipo non ben definito: la misteriosissima classe E. Ok, mi dico... non scoraggiamoci, clicchiamo su questo link alla classe E e guardiamocela, dopo tutto, che sarà mai... Eppure anche qui una brutta sorpresa: il link riapre la classe Vector. Domanda: è ricorsiva? Mi devo preoccupare? E' una proprietà estensionale non banale? Devo ricorrere al teorema di Rice per comprenderla?

Così, sconsolato, mi metto alla ricerca dei tutorial... chissà mai che ti spieghino cosa voglia dire: altra brutta sorpresa... i tutorial si riferiscono ancora alla "vecchia" 1.4.2!

Io sono disperato: DEVO programmare, DEVO far funzionare questi benedetti programmi, senza dover riscrivere tutto il codice e senza (possibilmente) implementarmi una benedettissima classe Vector a modo mio (cosa che non sarebbe complessa, ma che vorrei evitare per non perdere troppo tempo).

Qualcuno mi illumina su queste (passatemi il termine) schifezze che la Sun si è sentita in dovere di aggiungere (e modificare qua e là)?

Grazie anticipatamente (e scusate il piccolo sfogo).


Ciao. :ciauz:

LeleFT
25-10-2004, 22:49
uppete! :D

Angelo1974
25-10-2004, 23:34
Ciao Lele; forse ti dirò una cavolata perché l'1.5 non l'ho mai utilizzata; però ho letto delle Collection; precisamente del fatto che esse non sono + generiche ma tipizzate... forse quella <E> si riferisce proprio a ciò; infatti mi sembra che ora si possa scrivere:


Vector<Integer> v = new Vector();
o qualcosa del genere; ebbene, visto che così si è dichiarato alla VM che sio vuole creare un Vector di Integer i fighi della Sun avranno pensato.. che ce ne facciamo del vecchio add(Object o)? Tanto sappiamo che oggetti ci sono quì dentro ed ecco l'add(<E>); penso (e spero perché altrimenti chissa' che hanno pensato :D ) sia questo il ragionamento che hanno fatto.
Spero di esserti stato di aiuto; ciao :ciauz:

LeleFT
26-10-2004, 11:01
Sai... potresti avere ragione. Cercherò maggiori informazioni a riguardo. Se è così posso ancora utilizzare questo Vector nelle mie applicazioni, tanto, effettivamente, in un Vector si inseriscono quasi sempre gli stessi tipi di oggetto.

In caso contrario, mi rassegnerò a ricostruire la vecchia Vector :)


Ciao. :ciauz:

Angelo1974
26-10-2004, 11:32
Bene fammi sapere se è vero quello che ti ho detto; ciao :ciauz:

LeleFT
26-10-2004, 11:58
Dalle informazioni che ho trovato sul sito della Sun (certo che bisogna proprio avere occhio per trovarle queste informazioni...) sembra proprio che sia come dici tu. I nuovi Vector sono denominati "Typesafe" proprio perchè contengono oggetti tutti dello stesso tipo e, a quanto pare, i metodi di restituzione degli oggetti in esso contenuti dovrebbero forzare automaticamente il cast. Il solo problema è la sintassi che viene nettamente appesantita.

Così, ora, è possibile fare qualcosa del genere


Vector<String> vettore = new Vector();
vettore.add( new String("Ciao, che si dice") );
System.out.println( vettore.elementAt(0).toUpperCase() );

mentre prima si doveva forzare il cast


Vector vettore = new Vector();
vettore.add( new String("Ciao, che si dice") );
System.out.println( ((String) vettore.elementAt(0)).toUpperCase());

Non ho ancora provato perchè in questo momento non ho una JDK 1.5.0, ma proverò al più presto! :)

Ciao e grazie della dritta! :ciauz:

anx721
26-10-2004, 13:35
Hanno imitato i template del C++, anche se mi pare solo limitativamente alle strutture dati che rappresentano contenitori (liste, vettori, ecc ecc), e probabilmente in modo più pulito rispetto al C++,

:ciauz:

edriv
26-10-2004, 16:33
Certo che da Java mi aspettavo un nome più pulito di <E> :incupito:
Verdrò di farmi chiarezza...

E poi con le interfaccia non si sentiva il bisogno dei template!
Potevano piuttosto inserire le strutture.. forse...

Boh non linciatemi che non conosco bene questo linguaggio :fagiano:

Zero-2
27-10-2004, 15:51
Salve a tutti :)
Con la jdk1.5.0 hanno introdotto molte novità .
Però questi tipi di strutture non sono ancora supportate da programmi come Eclipse , non so JBuilder ...
Fino ad ora mi sarebbero state utili , ma non ho potuto utilizzarle , dato che uso principalmente Eclipse.

LeleFT
27-10-2004, 15:55
Beh... io il codice lo scrivo a mano, ma purtroppo le mie applicazioni scritte e funzionanti con la 1.4.2 dovrò modificarle per poterle ricompilare con la 1.5.0.

Prova a scrivere il codice a mano compilandolo da riga di comando, tanto se l'hai già installato il problema non sussiste. :)


Ciao. :ciauz:

Loading