Newsgroup: it.comp.java
Titolo: casting di array completo

Salve a tutti!
Sono nuovo del newsgroup e alle prime armi con java...
volevo sapere se è possibile effettuare il casting di un'intero array
di oggetti.
ho provato a fare qualcosa del genere:
Integer numeri[]=(Integer[])ogg[];
jbuilder compila perfettamente, ma a runtime ho un errore di
ClassCastException.
Graziemille in anticipo,
			Carlo



Ciao,
non mi e' chiaro cosa intendi fare...
Immagino...hai un array di Float (Float[]) e vuoi convertire tutti i Float in
Integer.
Non puoi farlo con un cast. Infatti un cast cambia il tipo del reference,
non cambia il tipo dell'oggetto. Questo comunque non dipende dal fatto di
usare un array o meno.
Float f = new Float(3.14f);
Integer i = (Integer)f; //NO!
Inoltre il tuo codice non dovrebbe nemmeno compliare correttamente.
Potrebbe compilare correttamente (e dare comunque a runtime una
ClassCastException) qualcosa del genere:
Object ogg[] = new Float[10];
Integer numeri[] = (Integer[])ogg;
Funzionerebbe correttamente invece:
Object ogg[] = new Integer[10];
Integer numeri[] = (Integer[])ogg;
-- 
Lucio Benfante
Brainbench MVP for Java 1
http://www.brainbench.com
MyTranscript: 
http://www.brainbench.com/transcript.jsp?pid=167064

Integer.
no, non è così...
in realtà ho una funzione che mi restituisce un array di oggetti, che
io voglio  "castare" in oggetti di un tipo specifico...
si tratta di un aprova di scrittura-lettura su file, molto rozzo
probabilmente, ma si tratta solo di una prova... ti pasto il codice...
import java.io.*;
class Persona implements Serializable
	{
		String nome,cognome;
		int età, peso;
		public Persona(String nom, String cognom, int et, int
pes)
			{
				nome=nom;
				cognome=cognom;
				età=et;
				peso=pes;
			}
		public String toString()
			{
				return "Nome: "+nome+"\nCognome:
"+cognome+"\nEta': "+età+"\nPeso: "+peso;
			}
	}
class ScriviFile
	{
		public static void scriviOggetto(String nom, Object
ogg1, Object ogg2) throws IOException
			{
				ObjectOutputStream output =new
ObjectOutputStream(new FileOutputStream(nom));
				output.writeObject(ogg1);
				output.writeObject(ogg2);
				output.close();
			}
		public static Object[] leggiOggetto(String nom) throws
IOException, ClassNotFoundException
			{
 
				ObjectInputStream input=new
ObjectInputStream(new FileInputStream(nom));
				Object
ogg[]={input.readObject(),input.readObject()};
				return ogg; //return incriminato
 
			}
		public static void main(String args[]) throws
IOException, ClassNotFoundException
			{
				ConsoleReader tastiera=new
ConsoleReader(System.in);
				String nome_file= tastiera.readLine();
				nome_file= nome_file.toLowerCase();
 
				Persona duffy=new
Persona("Duffy","Duck",19,68);
				Persona bugs=new
Persona("Bugs","Bunny",19,45);
 
 
scriviOggetto(nome_file+"_oggetto.txt",duffy,bugs);
				Persona
gente[]=(Persona[])leggiOggetto(nome_file+"_oggetto.txt"); //cast
perfetto in compilazione dà errore a runtime
				System.out.println(gente[0]);
				System.out.println(gente[1]);
			}
 
	}
forse ora ti è più chiara la situazione, naturalmete si potrebbe fare
il casting elemento per elemento, ma mi pare strano che non si possa
fare così..

 probabilmente, ma si tratta solo di una prova..
Guarda, basta ricordarsi che un array e' un oggetto: il casting segue le 
regole solite tra tipi e sottotipi (tipi derivati).
Ad esempio, un array e' sempre una sottoclasse di Object _e_ Object[], ma 
nient'altro: quindi gli unici cast validi (a parte con Object) per T[] 
(dove T e' un tipo) sono verso un array di uno qualunque dei supertipi di T 
+ Object.
In soldoni, prendi una classe BaseT, e sia T extends BaseT: 
 Object [] array = new T[10];
 BaseT[] array2 = (BaseT[])array;
 T[] array3=(T[])array;
 Object obj = array;
sono i cast validi.
Coi tipi primitivi, che non si possono estendere, rimangono solo i casting 
verso Object[] e Object.
Tutto il resto si fa a mano (o con l'utility class java.util.Arrays).
-- 
Life's something u don't get out alive..
ObjectZone - 
http://space.tin.it/computer/csadun

mi sembra stano però, se faccio il cast elemento per elemento tutto va
a gonfie vele!

 gonfie vele!
 
Il motivo e' che quando leggi gli oggetti li metti dentro ad un Object[],
e poi cerchi di fare un cast a Persona[]...ma tu hai un oggetto di  tipo
Object[] (non importa che contenga oggetti di tipo Persona).
E' come se tu facessi:
Object[] ogg = {new Persona("Pippo"), new Persona("Topolino")};
Questo, come risultato, e' equivalente a:
Object[] ogg = new Object[2];
ogg[0] = new Persona("Pippo");
ogg[1] = new Persona("Topolino");
non a:
Object[] ogg = new Persona[2];
ogg[0] = new Persona("Pippo");
ogg[1] = new Persona("Topolino");
...quindi, correttamente puoi fare il cast a Persona degli oggetti
contenuti nell'array, ma non puoi fare il cast a Persona[] dell'array,
perche' non e' un  oggetto di quel tipo (o di un suo supertipo).


grazie, ora č tutto chiaro!