|
|
|
![]() |
|
Strumenti |
![]() |
#21 |
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
la a non compila perché il modificatore private abbassa la visibilità del metodo, la quale può essere solo alzata o mantenuta. la e invece non compila perché il prototipo del metodo differisce solo per il tipo del valore di ritorno: se una classe avesse due metodi identici differenti solo per il tipo di ritorno verrebbero a crearsi delle ambiguità nel codice che usa uno di quei due metodi: non sarebbe chiaro quale dei due si sta usando, e quindi di che tipo dovrebbe essere il valore di ritorno.
|
![]() |
![]() |
![]() |
#22 |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
La covarianza del tipo restituito definisce come sovrascrittura la ridefinizione di un metodo del supertipo in un sottotipo che differisca per il tipo di valore restituito se questo sia compatibile in assegnamento con l'originale.
Cioè: Codice:
class A { Number fai(int a, float b) { ... } } class B extends A { Long fai(int a, float b) { ... } }
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
![]() |
![]() |
![]() |
#23 | |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Il metodo che fa l'override (nella sottoclasse quindi) 1) deve avere la stessa identica signature (nome+parametri) e lo stesso valore di ritorno (con l'eccezione del return covariante di Java 5+, che riguarda solo i tipi reference). 2) non deve avere un livello di accesso più ristretto ma può avere un livello di accesso meno ristretto. 3) Non può dichiarare eccezioni checked nuove o più "ampie" ma può dichiarare meno eccezioni checked o eccezioni checked più ristrette. Può dichiarare qualunque eccezione unchecked. 4) Il metodo nella superclasse di cui si fa l'override non deve essere marcato private (altrimenti non viene ereditato) o final (altrimenti non può esserci un override). Basandosi su queste regole: La risposta a) non compila perché in Over il livello di accesso è il default e il private del override è più ristretto del default. La risposta e) non compila perché il tipo di ritorno è diverso. Le altre risposte compilano perché sono altri casi di override/overload corretti.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) Ultima modifica di andbin : 09-07-2007 alle 19:20. Motivo: piccola correzione |
|
![]() |
![]() |
![]() |
#24 |
Senior Member
Iscritto dal: Jun 2005
Città: Napoli
Messaggi: 1661
|
grazie del pronto intervento
![]()
__________________
![]() |
![]() |
![]() |
![]() |
#25 |
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
e long è compatibile con int in assegnamento? se non erro in Java long occupa 64 bit, quindi assegnarlo ad un int dovrebbe significare perderne 32.
|
![]() |
![]() |
![]() |
#26 | |
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
![]() |
|
![]() |
![]() |
![]() |
#27 |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Perchè mai questo pazzo PGI-Bis avrà usato Number e Long nel suo esempio?
![]()
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
![]() |
![]() |
![]() |
#28 |
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
|
![]() |
![]() |
![]() |
#29 | |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
E andando un po' più a fondo .... la covarianza sul valore di ritorno viene implementata con i metodi "bridge". Dato: Codice:
class A { public Number prova () { return 123; } } class B extends A { public Long prova () { return 123L; } } public java.lang.Long prova(); public java.lang.Number prova(); Il metodo che ritorna Number è un metodo "bridge", sintetizzato dal compilatore e fa nient'altro che chiamare il metodo che ritorna Long. Perché? Per mantenere la compatibilità!
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
![]() |
![]() |
![]() |
#30 |
Senior Member
Iscritto dal: Jun 2005
Città: Napoli
Messaggi: 1661
|
eheh .. mi fa piacere che i miei dubbi creano vere e proprie discussioni
![]() ![]()
__________________
![]() |
![]() |
![]() |
![]() |
#31 |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Il cast è la conversione da un tipo ad un altro. Le regole sono molte (vedere sul JLS <qui>).
Alcuni cast possono essere impliciti, altri cast devono essere fatti esplicitamente usando l'apposito operatore di cast, il tipo tra parentesi tonde es. (int) A parte le conversioni particolari, le due fondamentali sono conversioni di widening (ampliamento) e di narrowing (restringimento). Entrambe si possono applicare ai tipi primitivi e ai tipi reference. Cosa non ti è chiaro di preciso? Purtroppo non è che posso enunciare qui in un unico post tutte le regole e le specifiche. ![]()
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 22:20.