0

java.text.ChoiceFormatAPI:

setChoices(double[] limits, String[] formats):设置要在格式化中使用的选项。

参数:

  • limits- 包含 [...]
  • formats- 是您要用于每个限制的格式。它们可以是Format对象或Strings。使用 object 格式化时Y,如果 object 是 a NumberFormat,则((NumberFormat) Y).format(X)调用 then 。否则Y.toString()被调用。

我很难理解参数的文档:如果声明了一个对象,formats你怎么可能将它传递给它?Format/NumberFormatsetChoicesString[] formats

请注意,有趣的是,getters 对应的setChoices声明如下:

这是 API 中的错误吗?是否应该声明 setter setChoices(double[], Object[]),还是我不明白如何setChoices正确使用?

4

3 回答 3

1

你可以查看源代码

在提到字符串/格式化程序二元性的注释中到处都提到了,但是实现只复制字符串

例如格式化双精度:

        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 复制,并且没有尝试格式化。

我只是认为该功能被“遗忘”了。

于 2010-06-12T09:37:55.387 回答
0

这已被报告为Bug 6960866并被接受。

AString[]永远不能包含instanceof Number/NumberFormat; 这违反了每个 OOP 子类型化原则。

如果您查看源代码,该private字段被声明为String[] choiceFormats,因此简单地声明setChoices(double[], Object[])不是一个简单的修复方法,而是会破坏代码。事实上,看看其余的代码,没有像文档声称的那样的功能:没有instanceof Number测试,(NumberFormat)代码中的任何地方都没有强制转换。

因此,鉴于源代码的当前状态,该错误位于文档中,该文档声称功能既不可能也不实际实现。

拥有这样的功能会非常好,而且可能应该存在,但目前还没有,所以这也可以看作是源代码中的一个错误,它缺少实现。

参考

于 2010-06-12T09:36:31.130 回答
0

它绝对看起来像一个错误。格式直接分配给 String[] 实例变量。源代码

于 2010-06-12T09:36:40.833 回答