Newsgroup: it.comp.java
Titolo: perchè non funziona questo cast?

Metodo (List <? T super Number>  numbers) ...
 
 
poi in un ciclo:
 
for ( Number n : numbers )
 
etc
 
e mi da errore, mi dice type mismatch e che non può castare (? super 
number) to number , e mi propone
 
for ( Object n : numbers )
 
 
Certamente object è una superclasse, ma non posso usare la stessa classe 
Number?
 
Grazie
 

 Metodo (List <? T super Number>  numbers) ...
 
 
rettifico,qui è così,senza la T :
 
 
  Metodo (List <? super Number>  numbers) ...
 
 
Mi meraviglia perchè quando scrivo
 
  Metodo (List <? extends Number>  numbers) ...
 
posso usare la stessa classe Number nel ciclo !
 


Ebbene no. Hai una lista che ammette le superclassi di Number, quindi 
solo Object.


List<? extends Number> ammette che si possano inserire oggetti di 
qualsiasi tipo che estenda Number, mentre l'iteratore della lista 
ritorna oggetti che estendono Number, che poi puoi assegnare al tipo 
effettivo, magari testando il tipo giusto, ad esempio tramite instanceof 
oppure tramite il metodo n.getClass().isAssignableFrom(Integer.class) 
ammesso che n non sia null.


quindi Object e Number si possono assegnare a Object ,
ma Object non si può assegnare a Number , giusto?
 
grazie


Ni.
L'espressione for ( Object n : numbers ) usa l'iteratore di numbers, 
ogni n dovra' essere un T di numbers, ovvero:
List<Number> numbers;
oppure
Number[] numbers;
ammettono sia:
for ( Object o : numbers )
che:
for ( Number o : numbers )
in entrambi i casi puoi inserire in numbers anche un oggetto che estenda 
Number.
Mentre puoi sempre fare un cast ad un tipo ammesso che che l'istanza di 
cui fai il cast estenda quel tipo.
Ad esempio:
for ( Object o : numbers ) {
   Number n = (o istanceof Number)?(Number)o:null;
ma anche:
   Number n = (o istanceof Integer)?(Integer)o:null;
oppure:
   Integer n = (o istanceof Integer)?(Integer)o:null;
 
Viceversa l'istanza di qualsiasi classe puo' sempre essere assegnata ad 
un Object, in virtu' del fatto che in Java la gerarchia di qualsiasi 
oggetto discende da Object.
 

 
 
capito! grazie

 Number?
 
Scusa, ma se il tipo che hai definito per gli elementi della lista e` un 
qualunque ancestor di Number, come puoi aspettarti che il tipo Number 
vada bene per loopare la lista?


Beh, non sara' particolarmente elegante, dipendentemente dallo scopo. Di 
fatto Number e' una classe astratta, iterando sugli elementi Number 
della lista si deve aspettare uno qualsiasi degli oggetti che discendono 
da Number, e quindi valutarne il tipo tramite metodi specializzati per 
ogni tipo o con un if bello lungo. Ma se ad esempio e' interessato al 
solo valore potrebbe utilizzare uno dei metodi di Number, doubleValue(), 
ad esempio, ammesso che l'eventuale arrotondamento sia o meno accettabile.


perchè number è superclasse di se stesso

 da Number
 
No, in quella lista ci si aspetta un qualsiasi oggetto istanza di 
superclasse di Number, e` diverso.
 

 perchè number è superclasse di se stesso
 
Eh? :D
 
Quel metodo accetta una lista che contenga oggetti che siano istanze di 
superclassi di Number. L'unico tipo consentito, quindi, e` Object.


Certamente, intendevo List<X>. Ho confuso i due casi.


Ho poi capito  leggere dalla lista o scriverci dentro sono due cose diverse.
 
In scrittura la lista accetta il tipo NUMBER , perchè è superclasse di 
se stesso in questo contesto (lower bound) , ma in lettura no perchè la 
lista potrebbe appunto contenere il tipo Object e non il tipo NUmber.
 
 
Questo comportamento asimmetrico mi aveva confuso.

 se stesso in questo contesto (lower bound)
 
In che senso? Che vuoi dire con "superclasse di se` stesso"? Posta il codice che usi per costruire la lista.


esempio di codice valido:
 
List<? super Integer> miaLista = new ArrayList<Integer>();  // il tipo 
Integer funge da superclasse di se stesso in questo contesto, viene 
quindi accettato!;
 
 
Però quando leggo dalla miaLista  posso assegnare solo variabili  Object 
, non anche di tipo Integer ! ( perchè giustamente la lista potrebbe 
contenere oggetti di tipo Object)