Ho appena scritto un po 'di codice con la seguente struttura:Perché questo non produce un'ambiguità?
public void method(int x) {
//...
}
public void method(int x, String... things) {
//...
}
Sono rimasto piuttosto sorpreso che questo compilato, e che se ho invocato
method(3);
allora sarebbe scegliere il primo. Ovviamente questo è in un certo senso il naturale da selezionare, ma se il primo metodo non esistesse, sarebbe un modo ragionevole di invocare il secondo (con un array varargs vuoto). Quindi sicuramente dovrebbe essere considerato ambiguo e produrre un errore in fase di compilazione?
Oppure si tratta di un caso speciale?
Sembra sbagliato trattarlo come tale, perché significa che l'aggiunta di un nuovo metodo potrebbe rompere il codice esistente, e questo non è uno stato di cose molto felice.
(chissà solo che quello che si finirebbe invocando se il primo sono stati aggiunti come nuovo metodo di una sottoclasse che contiene il secondo ...)
Hai chiamato un metodo con 1 parametro, perché chiamerebbe quello con 2 necessario? – loli
@loli perché non ce n'è uno con due necessari. Il secondo ha un parametro varargs, il che significa che la parte 'String ...' può prendere qualsiasi numero di argomenti, incluso zero. –
@ chiastic-security Ah non sapevo che fosse l'equivalente Java, pensavo che tu avessi scritto ... perché eri troppo pigro per trovare [] sulla tastiera i metodi varag – loli