Per chi si sta avvicinando alla programmazione con il linguaggio Java, anche questo errore può non essere di facile risoluzione.
Stiamo parlando dell’errore “Reference to X is ambiguous“, che può essere visualizzato in fase di compilazione di una nostra applicazione. Trattandosi di un errore di compilazione, quindi, sappiamo già che l’errore non riguarda la logica del programma, ma la sintassi del codice da noi scritta.
Quando si verifica questo errore, significa che il compilatore si è trovato di fronte ad un qualcosa di ambiguo, che quindi non ha saputo quale scelta effettuare.
L’ambiguità, in particolare, riguarda il nome delle classi, ma per capire da dove ha origine è necessario fare un piccolo passo indietro e concentrarsi sulla clausola import delle nostre classi.
La clausola import serve al compilatore per capire a cosa ci riferiamo quando utilizziamo i nomi delle classi. Essa non è una clausola obbligatoria, ma semplifica di molto la vita al prgorammatore, specialmente quando si vanno a realizzare progetti di grosse dimensioni. In che modo semplifica la vita al programmatore? La semplifica permettendogli di utilizzare dei nomi semplici per le classi (simple names), al posto dei nomi completi (full qualified names). Un esempio per chiarire; io posso scrivere, tranquillamente, la seguente riga di codice per utilizzare un Vector:
java.util.Vector v = new java.util.Vector();
Scrivendo in questo modo i nomi delle classi (utilizzando, cioè, il full qualified name) non ho alcun bisogno della clausola import: il compilatore sa già perfettamente a quale classi io mi sto riferendo. E’ ovvio che questo modo di referenziare le classi è scomodo e, alla lunga, ha il solo effetto di far perdere tempo (anche se, come vedremo più avanti in questo articolo, a volte è necessario). Utilizzando la clausola import possiamo, quindi, semplificarci un po’ la vita:
import java.util.Vector; … Vector v = new Vector();
Specificando, quindi, nella clausola import i nomi completi delle classi che andremo ad utilizzare, potremo riferirci ad esse utilizzando solamente il nome semplice. Ma anche questo, a lungo andare, diventa scomodo: dover specificare nella clausola import tutti i nomi non è né comodo, né bello da vedersi alla fine. Anche in questo caso, Java ci viene incontro, permettendoci di effettuare l’import di interi package. Così, se dobbiamo utilizzare più di una classe contenuta nel package java.util, possiamo scrivere in questo modo la clausola import:
import java.util.*;
L’asterisco alla fine significa “importa tutte le classi e le interfacce contenute nel package”. Questa tecnica viene chiamata “type-import-on-demand“, che significa “importazione del tipo su richiesta”. Ovvero, il compilatore, quando troverà il nome di una classe, la cercherà automaticamente all’interno di tutti i package specificati nell’import con tale meccanismo. Ed è proprio questa tecnica che porta all’errore di cui stiamo parlando. Vediamo un esempio concreto:
import java.util.*; import java.sql.*; … Resultset rs = …; // Eseguiamo una query su un DB Date d = rs.getDate(1); // Il primo campo è una data
L’ultima istruzione dell’esempio provocherà senza dubbio l’errore in questione. La compilazione di una classe fatta in questo modo visualizzerà questo messaggio d’errore:
reference to Date is ambiguous, both class java.util.Date in java.util and class java.sql.Date in java.sql match
Questo significa che il compilatore si è trovato di fronte ad una scelta ambigua: entrambi i package java.util e java.sql, infatti, contengono al loro interno una classe di nome Date ed il compilatore, per come è scritto il codice, non sa a quale delle due deve fare riferimento.
Ecco che, in questo caso, ritorna utile (anzi, necessario!) l’utilizzo del fully-qualified-name delle classi. Dobbiamo, cioè, essere più precisi quando scriviamo il riferimento alla classe e di conseguenza trasformare l’ultima riga in questo modo:
java.sql.Date d = rs.getDate(1); // Il primo campo è una data
Ora non ci sono più ambiguità: il compilatore sa esattamente che l’oggetto “d” che stiamo dichiarando è del tipo Date contenuto nel package java.sql.
Ricapitolando, quindi, quando ci troviamo di fronte a questo tipo di errore sappiamo che abbiamo commesso una “leggerezza”: cerchiamo di utilizzare una classe che però ha lo stesso nome di una contenuta in un package diverso, anch’esso presente nella sezione import del sorgente Java. Tutto quello che dobbiamo fare è andare a specificare meglio di che tipo di classe si tratta, anteponendovi davanti il nome completo.
Buona Programmazione!
Tags:ambiguous classe compilazione errore import java package reference
2 Risposte
Francesco d'Elia
December 31st, 2007 at 19:54
1Sinceri Auguri di Buon 2008, anno pari, bisestile ed Olimpico.. Non vi sembra abbastanza perchè possa portare bene.??
BradipoMissile
January 1st, 2008 at 11:52
2@ Francesco d’Elia
Tanti Auguri di Buon Anno anche a te!
Ti auguro tanta salute, felicità e successo personale!
RSS Iscriviti ai Feed dei commenti di questo articolo · TrackBack URI
Lascia un commento... please!!!
Autori
Categories
Calendario
Tag Cloud
Sondaggio
Blog Amici
Gente "Avanti"
Siti Interessanti
Benvenuto!
Pensieri / Aggiornamenti
Qualche statistica
Blog segnalato su