Заставить Number анализировать целую строку как двойную в Java - PullRequest
1 голос
/ 07 июля 2019

Как я могу разобрать набор числовых строк в общий массив?Вся моя проблема может быть сведена к следующему:

static <T extends Number> T[] parseBulk(String bulk, Class<T> type) throws ParseException {
    NumberFormat numberFormat = NumberFormat.getInstance();
    numberFormat.setParseIntegerOnly(false);

    String[] elements = bulk.split(";");
    T[] result = (T[])Array.newInstance(type, elements.length);
    for (int i= 0; i< elements.length; i++)
        result[i] = (T)numberFormat.parse(itemElements[i]); // here it crashes
    //  result[i] = type.cast(numberFormat.parseObject(itemElements[i])); // does not work either
    return result;
}

...

Double[] shouldBeDoubles = parseBulk("15.5;10", Double.class);

Похоже, что Number определяет результирующий тип по содержимому данной строки, что дает Double для "15,5" и Long для "10".

Затем он успешно вылетает, пытаясь преобразовать Long в T, который является Double.

Спасибо,

Обновление : добавлено число формата в исходный код,Извините:)

1 Ответ

1 голос
/ 07 июля 2019

NumberFormat.parse(String source) возвращает Number. Тип времени выполнения возвращаемого экземпляра может быть любым подклассом Number, поэтому, если он возвращает Long, вы не можете привести его к Double, как вы узнали.

Если вы хотите задать числовой тип, в который будут преобразованы String s, вы можете передать синтаксический анализатор Function методу:

static <T extends Number> T[] parseBulk(String bulk, Class<T> type, Function<String,T> parser) {
    String[] elements = bulk.split(";");
    T[] result = (T[])Array.newInstance(type, elements.length);
    for (int i= 0; i< elements.length; i++) {
        result[i] = parser.apply(elements[i]);
    }
    return result;
}

И назовите его, например, с помощью:

Double[] shouldBeDoubles = parseBulk("15.5;10", Double.class,Double::valueOf);

Будет выведено:

[15.5, 10.0]
...