FabioJ ha scritto:
Secondo me ,
A.prova(Object)
No. Innanzitutto il concetto di overload. Overloading significa dare lo stesso nome a più metodi della stessa classe (o tra una sotto-classe e super-classe, vale lo stesso) che però
devono avere quantità/tipi di parametri
differenti. Questo si usa per dare maggior "flessibilità" a chi vuole usare una certa funzionalità dell'oggetto. Insomma, più metodi in overload dovrebbero fare concettualmente la stessa/similare cosa ma con "input" differenti.
Tieni presente che le classi Byte, Short, Integer, Long ecc... hanno come super-classe Number, che fa da generalizzazione. E poi Number deriva da Object.
Altra cosa importante e fondamentale: l'overloading viene risolto in fase di
compilazione. E il compilatore sceglie la versione da invocare solo in base al tipo "statico" (quello che deduce il compilatore) del
reference su cui è invocato il metodo e in base al tipo statico degli argomenti.
Il metodo prova è invocato su
a che è di tipo A. Quindi SOLO i metodi di A vengono considerati. L'argomento è di tipo Double, questo è noto al compilatore. Dei tre metodi di A, quello prova(Long) NON è applicabile. La classe Long non c'entra niente con Double.
Restano quindi prova(Object) e prova(Number), entrambi sono in grado di gestire un Double. Il compilatore però sceglie sempre la versione più "specifica". E tra i due è Number ad essere più specifico di Object. Quindi il metodo invocato è
prova(Number)
Altro scenario, attenzione qui:
A a = new A();
Object o = new Double(12);
a.prova(o);
Ora?