来自java.text.ChoiceFormat
API:
setChoices(double[] limits, String[] formats)
:设置格式化时使用的选项。参数:
limits
- 包含[...]formats
- 是您要为每个限制使用的格式。它们可以是Format
个对象,也可以是String
个。使用对象Y
进行格式化时,如果对象是NumberFormat
,则调用((NumberFormat) Y).format(X)
。否则调用Y.toString()
。
我很难理解formats
参数的文档:如果Format/NumberFormat
声明为setChoices
,如何将String[] formats
对象传递给setChoices
?
请注意,有趣的是,String[]
的getter对应方声明如下:
double[] getLimits()
Object[] getFormats()
- 不是setChoices(double[], Object[])
!!! 这是API中的错误吗?是否应该将setter声明为setChoices
,或者我不理解如何正确使用{{1}}?
答案 0 :(得分:1)
您可以查看the source code
无处不在提及引用字符串/格式化程序二元性的注释中,但实现仅复制字符串
e.g。格式化双精度:
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]);
}
在回程中你清楚地看到它只是从stringarray复制而没有尝试格式化。
我只是认为功能被'遗忘'。
答案 1 :(得分:0)
此报告已被报告为Bug 6960866。
String[]
永远不能包含instanceof Number/NumberFormat
;这违背了每个OOP子类型原则。
如果您查看源代码,private
字段将声明为String[] choiceFormats
,因此只需声明setChoices(double[], Object[])
不是一个简单的修复,而是会破坏代码。事实上,查看其余的代码,没有像文档声明的那样的功能:代码中没有instanceof Number
测试,没有(NumberFormat)
转换。
因此,鉴于源代码的当前状态,该错误存在于文档中,该文档声称既不可能也不实际实现的功能。
这样的功能非常好,并且可能应该存在,但目前它不存在,所以这也可以被视为源中的错误代码,它缺少实现。
答案 2 :(得分:0)
它绝对看起来像一个bug。格式直接分配给String []实例变量。 Source code