Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

perchè non funziona questo cast?

30 views
Skip to first unread message

Gioacchino

unread,
Sep 6, 2019, 3:04:17 PM9/6/19
to
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

Gioacchino

unread,
Sep 6, 2019, 3:06:56 PM9/6/19
to
Il 06/09/2019 21:04, Gioacchino ha scritto:
> 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 !

Dr.UgoGagliardelli

unread,
Sep 7, 2019, 3:16:19 AM9/7/19
to
Ebbene no. Hai una lista che ammette le superclassi di Number, quindi
solo Object.

Dr.UgoGagliardelli

unread,
Sep 7, 2019, 3:43:58 AM9/7/19
to
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.

Gioacchino

unread,
Sep 7, 2019, 3:03:37 PM9/7/19
to
quindi Object e Number si possono assegnare a Object ,
ma Object non si può assegnare a Number , giusto?

grazie

Dr.UgoGagliardelli

unread,
Sep 8, 2019, 2:40:45 AM9/8/19
to
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.

Gioacchino

unread,
Sep 8, 2019, 6:36:31 AM9/8/19
to

>
> 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

4ndre4

unread,
Sep 12, 2019, 5:28:53 PM9/12/19
to
On 06/09/2019 20:04, Gioacchino wrote:

> Certamente object è una superclasse, ma non posso usare la stessa classe
> 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?

Dr.UgoGagliardelli

unread,
Sep 13, 2019, 3:26:45 AM9/13/19
to
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.

Gioacchino

unread,
Sep 13, 2019, 9:44:26 AM9/13/19
to
perchè number è superclasse di se stesso

4ndre4

unread,
Sep 14, 2019, 7:33:19 AM9/14/19
to
On 13/09/2019 08:25, Dr.UgoGagliardelli wrote:

> Beh, non sara' particolarmente elegante

Non e` questione di eleganza, e` questione di correttezza.

Se hai una classe A da cui ereditano sia X che Y, la lista che passi al
metodo che accetta List<? super X> potrebbe benissimo essere una lista
di Y, perche` potrei creare una lista di A e popolarla di Y, ma tu
decidi di usare il tipo X per loopare.
> della lista si deve aspettare uno qualsiasi degli oggetti che discendono
> da Number

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

4ndre4

unread,
Sep 14, 2019, 7:34:42 AM9/14/19
to
On 13/09/2019 14:44, Gioacchino wrote:

[...]
> 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.

Dr.UgoGagliardelli

unread,
Sep 16, 2019, 8:53:02 AM9/16/19
to
Certamente, intendevo List<X>. Ho confuso i due casi.

Gioacchino

unread,
Sep 16, 2019, 6:52:28 PM9/16/19
to
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.

4ndre4

unread,
Sep 20, 2019, 7:26:19 AM9/20/19
to
On Monday, 16 September 2019 23:52:28 UTC+1, Gioacchino wrote:

[...]
> In scrittura la lista accetta il tipo NUMBER , perchè è superclasse di
> 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.

Gioacchino

unread,
Sep 20, 2019, 12:19:23 PM9/20/19
to
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)
0 new messages