Java правильный способ конвертировать / приводить объект к Double - PullRequest
16 голосов
/ 21 сентября 2011

Я пытаюсь найти, но все кажется расплывчатым. Мне нужно конвертировать Object o в Double. Правильный ли способ сначала преобразовать в строку? Спасибо.

Ответы [ 7 ]

30 голосов
/ 21 сентября 2011
new Double(object.toString());

Но мне кажется странным, что вы переходите от объекта к двойнику.Вы должны лучше понять, с каким классом объекта вы начинаете, прежде чем пытаться выполнить преобразование.Там может быть небольшая проблема с качеством кода.

Обратите внимание, что это преобразование, а не приведение.

12 голосов
/ 21 сентября 2011

Вы не можете привести объект к Double, если объект не Double.

Проверьте API .

особенно примечание

valueOf(double d);

и

valueOf(String s);

Эти методы дают вам возможность получить экземпляр Double из String или двойного примитива. (Также не конструкторы; прочитайте документацию, чтобы увидеть, как они работают). Объект, который вы пытаетесь преобразовать естественным образом, должен дать вам нечто, что может быть преобразовано в двойной.

Наконец, имейте в виду, что Double экземпляры являются неизменяемыми - после создания вы не можете их изменить.

7 голосов
/ 11 января 2017

Если ваш объект представляет число, например, целое число, вы можете привести его к числу, а затем вызвать метод doubleValue ().

Double asDouble(Object o) {
    Double val = null;
    if (o instanceof Number) {
        val = ((Number) o).doubleValue();
    }
    return val;
}
6 голосов
/ 21 сентября 2011

Вы можете использовать оператор instanceof, чтобы проверить, является ли он двойным до приведения.После этого вы можете спокойно бросить его на удвоение.Кроме того, вы можете проверить его на соответствие другим известным типам (например, Integer), а затем вручную при необходимости привести их к двойному типу.

    Double d = null;
    if (obj instanceof Double) {
        d = (Double) obj;
    }
2 голосов
/ 01 ноября 2013



Также стоит упомянуть - если вы были вынуждены использовать более старую версию Java до 1.5 и пытаетесь использовать Коллекции, вы не сможете параметризовать коллекцию с типом, таким как Double.

Вам придется вручную « box » для класса Double при добавлении новых элементов и « unbox » в примитив double путем анализа и приведения, делая что-то вроде этот:

LinkedList lameOldList = new LinkedList();
lameOldList.add( new Double(1.2) );
lameOldList.add( new Double(3.4) );
lameOldList.add( new Double(5.6) );

double total = 0.0;
for (int i = 0, len = lameOldList.size(); i < len; i++) {
  total += Double.valueOf( (Double)lameOldList.get(i) );
}


Список старой школы будет содержать только тип Object и должен быть приведен к Double.

Кроме того, вы не сможете перебирать список с помощью расширенного цикла в ранних версиях Java - только с циклом for.

2 голосов
/ 24 июля 2013

В версии Java до 1.7 вы не можете привести объект к примитивному типу

double d = (double) obj;

Вы можете просто превратить объект в Double

Double d = (Double) obj;

Осторожно, он может бросить объектClassCastException, если ваш объект не Double

1 голос
/ 13 декабря 2017

перепробовал все эти методы для конвертации ->

obj2Double

    public static void main(String[] args) {

    Object myObj = 10.101;
    System.out.println("Cast to Double: "+((Double)myObj)+10.99);   //concates

    Double d1 = new Double(myObj.toString());
    System.out.println("new Object String - Cast to Double: "+(d1+10.99));  //works

    double d3 = (double) myObj;
    System.out.println("new Object - Cast to Double: "+(d3+10.99));     //works

    double d4 = Double.valueOf((Double)myObj);
    System.out.println("Double.valueOf(): "+(d4+10.99));        //works

    double d5 = ((Number) myObj).doubleValue();
    System.out.println("Cast to Number and call doubleValue(): "+(d5+10.99));       //works

    double d2= Double.parseDouble((String) myObj);
    System.out.println("Cast to String to cast to Double: "+(d2+10));       //works
}
...