ChoiceFormat.setChoices confusione sul tipo di parametro di formato e la documentazione
-
26-09-2019 - |
Domanda
setChoices(double[] limits, String[] formats)
:. Impostare le scelte da utilizzare nella formattazioneParametri:
limits
- contiene [...]formats
- sono i formati che si desidera utilizzare per ogni limite. Essi possono essere sia oggettiFormat
oString
s. Quando formattazione con oggettoY
, se l'oggetto è unNumberFormat
, allora((NumberFormat) Y).format(X)
viene chiamato. In caso contrario, si chiamaY.toString()
.
Sto avendo difficoltà a capire la documentazione per il parametro formats
: come si fa a passare un oggetto Format/NumberFormat
per setChoices
se è dichiarata String[] formats
Si noti che è interessante notare che, il getter controparte di setChoices
sono dichiarati come segue:
-
double[] getLimits()
-
Object[] getFormats()
- nonString[]
!!!
Si tratta di un bug nel API? Se il setter sono state dichiarate setChoices(double[], Object[])
invece, o sto non capire come usare setChoices
correttamente?
Soluzione 3
Questo è stato segnalato e accettato come Bug 6.960.866 .
Un String[]
non può mai contenere un instanceof Number/NumberFormat
; che va contro ogni OOP sottotipizzazione principi.
Se si guarda il codice sorgente, il campo private
è dichiarato come String[] choiceFormats
, così semplicemente dichiarando setChoices(double[], Object[])
non è una soluzione semplice, e sarebbe invece rompere il codice. In effetti, guardando il resto del codice, non v'è alcuna funzionalità come quanto sostiene la documentazione:. Non esiste un test instanceof Number
, non ovunque (NumberFormat)
cast il codice
Quindi, allo stato attuale del codice sorgente, l'errore è nella documentazione, che rivendica la funzionalità che è possibile né effettivamente attuato.
Tale funzionalità sarebbe molto bello di avere, e, probabilmente, dovrebbe esiste, ma attualmente non è così, quindi questo può anche essere visto come un bug nel codice codice, che manca l'implementazione.
Bibliografia
Altri suggerimenti
È possibile controllare il codice sorgente
Ovunque si fa menzione nei commenti riferendosi alla dualità di stringa / formattatore, tuttavia l'applicazione copia solo le stringhe
es. formattazione di un doppio:
public StringBuffer format(double number, StringBuffer toAppendTo,
FieldPosition status) {
// find the number
int i;
for (i = 0; i < choiceLimits.length; ++i) {
if (!(number >= choiceLimits[i])) {
// same as number < choiceLimits, except catchs NaN
break;
}
}
--i;
if (i < 0)
i = 0;
// return either a formatted number, or a string
return toAppendTo.append(choiceFormats[i]);
}
Nel ritorno chiaramente vederlo solo copie dalla StringArray e nessun tentativo di formato è fatto.
I basti pensare che la funzionalità è stata 'dimenticata'.
Si presenta sicuramente come un insetto. formati è assegnato direttamente ad una variabile di istanza String []. codice sorgente .