Newsgroup: it.comp.java
Titolo: Ottenere tipo primitivo da wrapper

Salve ragazzi,
come da oggetto : se ho un'istanza di tipo X (Integer, Double, Float) come 
posso, via reflection, ottenere l'equivalente primitivo di tipo x ? (int, 
double, float).
Saluti e grazie,
    Scorpio. 

 double, float).
La reflection non serve.
Puoi fare cosě:
  Integer a = ...
  int b = a.intValue();
Con Java >= 1.5 puoi fare direttamente cosě (grazie all'autoboxing):
  Integer a = ...
  int b = a; // viene trasformato da Integer a int automaticamente
-- 
Andrea Francia
alias rm='trash' #use trash command instead of removing
rm -Rfv file     #put the file in the KDE trashcan
http://www.andreafrancia.it/trash

 double, float).
Ciao,
dato che tutti i wrapper "numerici" estendono la classe Number, è 
sufficiente che chiami il metodo di tale classe. Ovviamente quale 
chiamare dipende da qual'è il risultato che ti aspetti.
Number x = ...
int ix = x.intValue();
double dx = x.doubleValue();
float fx = x.floatValue();
...oppure, come ti hanno già suggerito, con l'unboxing di Java 5:
Number x = ...
int ix = x;
double dx = x;
float fx = x;
-- 
Lucio Benfante
JUG Padova           
http://www.parancoe.org
 ...have a look at it!
www.jugpadova.it
 
http://www.jugevents.org


Scusate, mi sono accorto che nel post mi sono spiegato malissimo. Sto 
cercando di sviluppare un mini-framework per deserializzare / serializzare 
oggetti Java e oggetti .NET utilizzando XML per ottenere l'interoperabilitŕ 
tra i due linguaggi e mi sono scontrato con problemi di varia natura. Uno di 
questi č stato quello di creare array di elementi di tipo arbitrario, 
leggendo da XML il tipo di ciascun elemento dell'array che si vuole creare.
Ad esempio con qualcosa del tipo
Array.newInstance(Class.forName(baseType), totalElements)
riesco a creare un array di oggetti il cui tipo č baseType: ammettiamo che 
baseType sia "int". Il codice suesposto non funziona, e allora ricorro al 
wrapper equivalente, che č Integer. Alla fine sono riuscito a gestire i casi 
di mio interesse, in modo perň poco raffinato (nell'XML rappresentante il 
mio oggetto esplicitamente aggiungo un attributo che determina se voglio un 
tipo primitivo o il suo wrapper) e  la domanda resta aperta: non esiste 
nulla su Object
che sia equivalente ad un getPrimitiveValue() ?
Scorpio.

 che sia equivalente ad un getPrimitiveValue() ?
Non capisco bene cosa stai chiedendo ma i dati primitivi non sono Object.
Cosa dovrebbe restituire getPrimitiveValue()?


 che sia equivalente ad un getPrimitiveValue() ?
No, non c'è.
Comunque ora è un po' più chiaro il problema.
Se non ho capito male, sostanzialmente collassi tutto su (ad esempio) 
array di Integer. Perchè invece non usare array di int? Il problema è 
che non può essere usato Class.forName per creare un'istanza del Class 
per il tipo int, ma devi usare il class litteral int.class:
Array.newInstance(int.class, totalElements)
Altra faccenda. Immagino tu non lo stia facendo per gioco, ma per 
lavoro. Hai valutato librerie di serializzazione già esistenti, ad 
esempio XStream (
http://xstream.codehaus.org
) e il corrispondente per 
.NET (
http://code.google.com/p/xstream-dot-net/
)? (non so se siano 
interoperabili)
Nel caso abbiate valutato tali alternative, perchè le avete scartate e 
avete deciso di fare in proprio?
Lucio


 Cosa dovrebbe restituire getPrimitiveValue()?
getPrimitiveValue() dovrebbe ritornare un int se l'oggetto su cui si usa è 
un Integer, un double se un Double... ma immagino che questo metodo non 
esista.
Scorpio.


 avete deciso di fare in proprio?
Lunga storia, che ti riassumo brevemente. Per guadagnare in flessibilità, 
ossia avere un unico endpoint di chiamata a servizio, l'architettura fu 
sviluppata essenzialmente seguendo il DataTransferHashmap pattern. In altre 
parole, i servizi architetturali ricevono una struttura dati derivata da 
HashMap come container generico; a seconda del tipo di servizio questa 
"scatola nera" viene popolata di classi Java necessarie ad un certo 
servizio. Esiste un servizio unico che fa da FrontEndController, e, in base 
al codice di servizio chiamato, smista la chiamata in modo indiretto ad 
altre classi (EJB; Servlet, Pojo etc).
Una porcheria o una buona idea ? Sospendo il giudizio, e se darai un tuo 
parere ti sarò grato, almeno ho un parere in più. Quando la proposi, mi 
sembrava utile - eravamo in due a sviluppare - limitare gli sforzi.
Ora per interagire con .NET e non legarci a soluzioni proprietarie, l'idea 
era di utilizzare i Web Services. Forse con JAXB potrei risolvere 
brillantemente il problema di serializzare in WSDL bean java "custom", ma il 
nostro appserver non supporta JAXB (eh, sì...). Quindi l'idea era di 
costruire un unico web service in cui il dato passato fosse il documento XML 
(quindi, una stringa) rappresentante la serializzazione della mia HashMap.
Anzichè fare in casa ho cercato su internet se il problema fosse stato 
affrontato già da qualcuno e fosse stato risolto, e con un certo stupore a 
parte XStream non ho trovato granchè, il che mi fa temere anche che XStream 
sia un progetto ormai desueto... il che può implicare, tra le altre cose, 
che la mia sia una pessima idea di architettura, che ci  può stare.
Saluti,
    Scorpio.


 (quindi, una stringa) rappresentante la serializzazione della mia HashMap.
In questa situazione mi sembra una buona idea. Una scocciatura che vedo 
mi sembra quella di dover scrivere le stesse classi (e mantenerle 
sincronizzate) in entrambe le piattaforme. Boh.
Ciao


 sincronizzate) in entrambe le piattaforme. Boh.
Vero anche questo (il problema della sincronizzazione), ma si tratta di 
classi ValueObject e poco piů... se Java avesse le struct, per dire, avrei 
usato quelle.
Scorpio.
