Подтвердить что ты не робот

ClassCastException, литье Integer в Double

ArrayList marks = new ArrayList();
Double sum = 0.0;
sum = ((Double)marks.get(i));

Каждый раз, когда я пытаюсь запустить свою программу, я получаю исключение ClassCastException, которое гласит: java.lang.Integer не может быть добавлен в java.lang.Double

4b9b3361

Ответ 1

Мы можем применить int к double, но мы не можем сделать то же самое с классами-оболочками Integer и double:

 int     a = 1;
 Integer b = 1;   // inboxing, requires Java 1.5+

 double  c = (double) a;   // OK
 Double  d = (Double) b;   // No way.

Показывает ошибку времени компиляции, которая соответствует вашему исключению во время выполнения.

Ответ 2

Ну, код, который вы показали, фактически не включает добавление целых чисел в ArrayList, но если вы знаете, что у вас есть целые числа, вы можете использовать:

sum = (double) ((Integer) marks.get(i)).intValue();

Это преобразует его в int, который затем может быть преобразован в double. Вы не можете просто использовать непосредственно между классами в штучной упаковке.

Обратите внимание, что если вы можете использовать дженерики для своего ArrayList, ваш код будет более понятным.

Ответ 3

Код, отправленный в вопросе, явно не является полным примером (он ничего не добавляет к arraylist, он не определяет i в любом месте).

Сначала, как говорили другие, вам нужно понять разницу между примитивными типами и типами классов, которые их убирают. Например. Integer боксы int, Double боксы Double, Long boxes Long и так далее. Java автоматически блокирует и распаковывает файлы в разных сценариях (раньше вам приходилось вставлять и распаковывать вручную вызовы библиотеки, но это считалось уродливым PITA).

http://docs.oracle.com/javase/tutorial/java/data/autoboxing.html

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

Таким образом, ответ на ваш вопрос зависит от того, что находится в вашем arraylist, если это просто объекты типа Integer, которые вы можете сделать.

sum = ((double)(int)marks.get(i));

Приведение в int за кадром сначала приведет результат от marks.get до Integer, после чего он будет деблокировать это целое число. Затем мы используем другой актер, чтобы преобразовать примитив int в примитив Double. Наконец, результат будет автоматически обновлен до Double, когда он будет присвоен переменной суммы. (asside, вероятно, более разумно было бы, чтобы сумма имела тип Double, а не Double в большинстве случаев).

Если ваш arraylist содержит смесь типов, но все они реализуют интерфейс Number (Integer, Short, Long, Float и Double all do, но Character и Boolean do not), то вы можете сделать.

sum = ((Number)marks.get(i)).doubleValue();

Если в миксе есть и другие типы, вам может потребоваться использовать оператор instanceof для их идентификации и принятия соответствующих мер.

Ответ 4

укажите свои метки:

List<Double> marks = new ArrayList<Double>();

Это называется generics.

Ответ 5

Изменение целого числа на двойной

int abc=12; //setting up integer "abc"

System.out.println((double)abc); 

В коде будет выводиться целое число "abc" как двойное, что означает, что оно будет отображаться как "12.0". Обратите внимание, что существует десятичное место, указывающее, что эта цифра точности сохранена.

То же самое с двойным, если вы хотите изменить его,

double number=13.94;

System.out.println((int)number); 

Этот код будет печатать на одной строке, "число" - как целое число. Выход будет "13". Обратите внимание, что это значение не было округлено, данные фактически были опущены.

Ответ 6

2 вещи, чтобы понять здесь -

1) Если вы применяете примитив interger к примитиву double. Оно работает. например Он отлично работает.

int pri=12; System.out.println((double)pri);

2), если вы попытаетесь передать объект Integer объекту double или наоборот, он не работает.

Integer a = 1; Double b = (double) a; // WRONG. Fails with class cast excptn

Решение -

Soln 1) Integer i = 1; Double b = new Double(i);
soln 2) Double d = 2.0; Integer x = d.intValue();

Ответ 7

sum = Double.parseDouble(""+marks.get(i));

Ответ 8

Это означает, что ваш ArrayList имеет целые числа в некоторых элементах. Кастинг должен работать, если в одном из ваших элементов нет целого числа.

Один из способов убедиться, что ваш arraylist не имеет целых чисел, объявляя его как массив Doubles.

    ArrayList<Double> marks = new ArrayList<Double>();

Ответ 9

Я думаю, что основная проблема заключается в том, что вы выполняете кастинг с использованием класса-оболочки, кажется, что они являются несовместимыми типами.

Но другая проблема заключается в том, что "i" - это int, поэтому вы делаете окончательный результат, и вы также должны использовать i. Также попробуйте использовать ключевое слово "double" для создания, а не для класса "Double".

Здесь вы можете проверить:

Надеюсь, это поможет. Я нашел, что поток полезен, но я думаю, что это помогает ему прояснить его.