2009-04-06 16 views
5

Sto provando a utilizzare un costruttore sovraccarico in Java che può accettare uno int[] o uno String. Ricevo un errore di compilazione, che sembra indicare che in questa chiamata del costruttore sarebbe ambiguo se la variabile fosse una stringa null o un array null.Ambiguità overload del costruttore

C'è un modo semplice per aggirare questo?

+0

Per la cronaca, non ho accettato una risposta qui, perché la mia domanda iniziale era talmente fuorviata che è difficile dire cosa è giusto. Grazie per l'input –

risposta

16

Fusioni l'argomento di uno dei tipi:

Foo f1 = new Foo((int[]) null); 
// or 
Foo f2 = new Foo((String) null); 
5

Il modo più semplice - evitare null. Se è vuoto, String usa ""; un vuoto int[] usa new int[].

Per rispondere alla domanda è possibile utilizzare un cast o assegnare null a una variabile:

new MyClass((String)null) 

final String nullString = null; 
new MyClass(nullString) 

Il primo è generalmente preferito, se avete intenzione di farlo a tutti.

4

forse è possibile aggiungere un costruttore senza argomenti.

+0

Questa è probabilmente la soluzione migliore se il valore null ha un significato specifico. –

+0

Dipende se new MyClass ((String) null) e new MyClass ((int []) null) significano la stessa cosa. (Mi piacciono molto i metodi di creazione statica anziché i costruttori nudi sovraccaricati). –

2

Se si ha il controllo della classe che si desidera istanziare, prendere in considerazione l'utilizzo di un metodo di produzione statico in modo da poter assegnare due nomi separati ed evitare la confusione legata all'overload.

public static Foo createFromIntArray(final int[] ints) { ... } 
public static Foo createFromString(final String str) { ... } 

Altrimenti, decidere cosa rappresenta il nullo: è un array nullo di ints o una stringa nullo? È possibile che la classe che stai costruendo si comporti in modo diverso l'una data l'una sull'altra. Una volta che sai che cosa rappresenta il tuo nullo, basta lanciarlo su quel tipo nella chiamata al costruttore.

new Foo((String) null); 
new Foo((int[]) null); 

Infine, suona come si potrebbe essere il passaggio di un riferimento a un oggetto di questo costruttore, invece di un esplicito null. Forse qualcosa che stai ricevendo da un java.util.Map. In tal caso, è possibile testare questo oggetto con instanceof e eseguire il cast sul tipo appropriato prima di inviarlo al costruttore in questione.

Problemi correlati