|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2780
|
[JAVA] Domanda sul cast
Vorrei sapere come mai questo codice funziona:
Codice:
public class CodaArray<T> implements Coda<T> {
T[] elementi;
int testa, lunghezza;
public CodaArray(int n) {
elementi = (T[]) new Object[n];
testa = 0;
lunghezza = 0;
}
public boolean èVuota() {
return lunghezza == 0;
}
public void accoda(T element){
if(lunghezza<elementi.length){
elementi[(testa+lunghezza)%elementi.length]=element;
lunghezza++;
}
}
public T primo(){
if(lunghezza==0) return null;
return elementi[testa];
}
public T estraiPrimo(){
if(lunghezza==0) return null;
T el=elementi[testa];
testa++;
if(testa==elementi.length)
testa=0;
lunghezza--;
return el;
}
public static void main(String[] args){
Coda<Integer> q=new CodaArray<Integer>(10);
q.accoda(2);
q.accoda(12);
System.out.println(q.estraiPrimo()+" "+q.estraiPrimo());
}
}
Codice:
public class Prova{
public static void main(String[] args){
String[] a=(String[])new Object[10];
}
}
E magari tanto che ci siete mi spiegate anche quando viene visualizzato il seguente warning? Codice:
warning: [unchecked] unchecked cast Grazie! |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2780
|
Uppete!
|
|
|
|
|
|
#3 | |||
|
Senior Member
Iscritto dal: Oct 2006
Città: Roma
Messaggi: 1383
|
Quote:
Quote:
Quote:
|
|||
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2780
|
Quote:
Qui la cosa che non capisco è come è possibile fare il cast da un oggetto di tipo meno particolare ad uno più particolare. Io lo vedo (evidentemente sbaglio) come se facessi Codice:
String s=(String)new Object(); Lo stesso: java.lang.ClassCastException E riguardo al fatto che me lo dà anche alla riga che ho evidenziato? Qual è il motivo? |
|
|
|
|
|
|
#5 | ||||
|
Senior Member
Iscritto dal: Oct 2006
Città: Roma
Messaggi: 1383
|
Quote:
il cast serve in casi come questi: Codice:
Object actuallyAString = "hello, world"; String string = (String)actuallyAString; Quote:
Quote:
peró io non capisco quale sia, nel tuo esempio, l'oggetto non castabile: non hai assegnato nessun elemento nell'array. Quote:
Codice:
class Generic<T>
{
public Generic(T t)
{
Object[] objectArray = new Object[2];
objectArray[0] = t;
objectArray[1] = new Object();
T[] array = (T[])objectArray;
System.out.println(array[0].toString());
System.out.println(array[1].toString());
}
}
.
.
.
new Generic<String>("ciao");
|
||||
|
|
|
|
|
#6 | ||||
|
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2780
|
Forse mi sono spiegato male: non mi sono chiesto come è possibile fare un cast da un tipo meno particolare a uno più particolare, ma come è possibile fare un cast da un oggetto di tipo meno particolare a uno più particolare. L'oggetto in questo caso è un array di Object e si vuole fare un cast a qualcosa di più particolare, ossia un array di T.
Quote:
Quote:
Nel codice sto assumendo che in un array T[] gli oggetti possono tranquillamente essere degli Object. O no? Quote:
Quote:
Codice:
String s=(String)new Object(); |
||||
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
|
è tutto assolutamente normale.
Quando istanzi un array di object e poi lo casti a string[] al compile time non hai ovviamente alcun errore, ma al runtime, quando la VM tenta di utilizzare l'array di object come fosse un array di string ti va in eccezione perchè i due tipi sono diversi. Col generic ti funziona invece perchè stai facendo il contrario, ovvero stai castando un qualsiasi oggeto (che per definizione estende da object) ad object, operazione perfettamente lecita. Se fai la stessa cosa nel tuo codice fuori dalla classe generic ovviamente ti funziona dato che: Codice:
Object[] o = (Object[])new String[10];
__________________
|
|
|
|
|
|
#8 | ||||||
|
Senior Member
Iscritto dal: Oct 2006
Città: Roma
Messaggi: 1383
|
Quote:
comunque: convertire da un oggetto meno particolare ad uno piu particolare é possibile proprio grazie al cast esplicito (esempio: é possibile interpretare un riferimento di tipo Object come se fosse di tipo String se effettivamente esso si riferisce ad un oggetto String; altrimenti ClassCastException). invece: convertire da un oggetto piu particolare ad uno meno particolare ovviamente é possibile in maniera del tutto naturale (esempio: un riferimento di tipo String puó essere assegnato ad uno di tipo Object con cast implicito). chiarito questo andiamo avanti. Quote:
Quote:
Quote:
Quote:
Quote:
|
||||||
|
|
|
|
|
#9 | |||
|
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2780
|
Inizio a capire ma c'è ancora qualcosa che non mi è chiaro... scusatemi.
Quote:
Codice:
elementi = (T[]) new Object[n]; Quote:
Codice:
String[] a=(String[])new Object[10]; Quote:
Anche questo mi sembra ragionevole. Grazie. |
|||
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
|
vero, ho letto male
![]() cmq nel generic te lo fa fare perchè a quel livello non sa di che tipo è T. Potrebbe benissimo essere un Object, e in quel caso è perfettamente legale. Se però usi come tipo String allora al runtime ti darà un errore. Ergo, usare dei cast espliciti in quel modo all'interno di una classe generic è altamente sconsigliato dato che rompi la type safety al compile time, non per niente ti viene comunicato un warning
__________________
|
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2780
|
Eppure a runtime funziona con il main che ho scritto, cioè dove uso Integer (se avessi usato String sarebbe stato lo stesso). Ti passo anche l'interfaccia così puoi provare.
Codice:
public interface Coda<T> {
public boolean èVuota();
public void accoda(T element);
public T primo();
public T estraiPrimo();
}
|
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
|
allega tutto il progetto così gli do un occhiata
__________________
|
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2780
|
Praticamente sono solo i due file che ho postato, l'interfaccia e l'implementazione. Ti ho allegato anche i file class, nel caso non avessi il compilatore sotto mano. Grazie
|
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Una piccolezza:
Codice:
public interface Coda<T> {
public boolean èVuota();
public void accoda(T element);
public T primo();
public T estraiPrimo();
}
Non usare mai lettere accentate nel codice sorgente, aggiungo neanche nei commenti.
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
|
|
|
|
|
#15 |
|
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2780
|
Che tipo di problemi comporta? Comunque in genere scrivo tutto in inglese ma questo è un esempio che ho preso dalle slide di un mio professore.
|
|
|
|
|
|
#16 | |
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Quote:
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
|
|
|
|
|
|
#17 |
|
Senior Member
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
|
ok provato.
Mi sa che il compilatore si accorge che in realtà gli viene passato un tipo integer e aggiorna automaticamente l'array trasformandolo da object ad integer evitando l'errore al run-time.. è l'unica spiegazione che mi viene in mente....
__________________
|
|
|
|
|
|
#18 |
|
Senior Member
Iscritto dal: Oct 2006
Città: Roma
Messaggi: 1383
|
impone restrizioni sul charset con cui deve essere salvato il file: non tutti i charset supportano i caratteri accentati, cosi come altri caratteri. in generale sarebbe bene usare sempre e solo i caratteri del set ASCII non esteso: lettere minuscole e maiuscole, numeri, punteggiature, simboli comuni.
|
|
|
|
|
|
#19 | |
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Quote:
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
|
|
|
|
|
|
#20 | |||
|
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2780
|
Quote:
Tuttavia quello che diceva fero86 non mi sembrava sbagliato, mi riferisco a Quote:
Codice:
String[] a=(String[])new Object[10]; //E in realtà qui da errore Codice:
Object[] oA={new Object()};
String[] sA=(String[])oA;
String s=sA[0]; //Qui dovrebbe dare errore
Quote:
|
|||
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 08:05.





















