Невозможно преобразовать из типа объекта в длинный - PullRequest
16 голосов
/ 28 февраля 2010

У меня есть хеш-таблица с именем table. Типовое значение long. Я получаю значения, используя .values(). Теперь я хочу получить доступ к этим значениям.

Collection val = table.values();

Iterator itr = val.iterator();
long a  =   (long)itr.next();

Но когда я пытаюсь получить его, он выдает ошибку, потому что я не могу преобразовать тип object в long. Как я могу обойти это?

Ответы [ 7 ]

34 голосов
/ 28 февраля 2010

Попробуйте это:

  Long a = (Long)itr.next();

В результате вы получаете объект Long, но с автобоксом вы можете использовать его почти как примитивный long.

Другой вариант - использовать Generics:

  Iterator<Long> itr = val.iterator();
  Long a = itr.next();
7 голосов
/ 31 августа 2016

Number класс может использоваться для преодоления числового типа данных.

В этом случае может использоваться следующий код:

long a = ((Number)itr.next()).longValue();



Я подготовил примеры ниже:

Object до long пример - 1

// preparing the example variables
Long l = new Long("1416313200307");
Object o = l;

// Long casting from an object by using `Number` class
System.out.print(((Number) o).longValue() );

Консоль Вывод будет:

1416313200307



Object до double пример - 2

// preparing the example variables
double d = 0.11;
Object o = d;

// Double casting from an Object -that's a float number- by using `Number` class
System.out.print(((Number) o).doubleValue() + "\n");

Консоль Вывод будет:

0.11



Object до double пример - 3

Будьте осторожны с этой простой ошибкой ! Если значение с плавающей запятой преобразуется с помощью функции doubleValue(), первое значение может не совпадать с конечным значением.
Как показано ниже 0.11! = 0.10999999940395355.

// preparing the example variables
float f = 0.11f;
Object o = f;

// Double casting from an Object -that's a float number- by using `Number` class
System.out.print(((Number) o).doubleValue() + "\n");

Консоль Вывод будет:

0.10999999940395355



Object до float пример - 4

// preparing the example variables
double f = 0.11;
Object o = f;

// Double casting from an Object -that's a float number- by using `Number` class
System.out.print(((Number) o).floatValue() + "\n");

Консоль Вывод будет:

0.11
4 голосов
/ 28 февраля 2010

Попробуйте: long a = ((Long) itr.next()).longValue();

3 голосов
/ 28 февраля 2010

Вы должны использовать новые Дженерики функции из Java 5.

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

Generics предоставляет вам возможность сообщить тип коллекции компилятору, так что это может быть проверено. Как только компилятор знает тип элемента коллекции, Компилятор может проверить, что вы использовали коллекция последовательно и может вставьте правильное приведение значений вынимается из коллекции.

Вы можете прочитать это краткое howto или это более полное руководство .

1 голос
/ 14 октября 2012

в моем случае у меня есть массив объектов, которые я получаю от клиента Flex

иногда числа могут интерпретироваться Java как int, а иногда как long,

поэтому для решения проблемы я использую функцию toString () следующим образом:

public Object run(Object... args) {

  final long uid = Long.valueOf(args[0].toString());
0 голосов
/ 28 октября 2014

Я столкнулся с той же проблемой, но во время кодирования JSP. Вышеупомянутые предложения относительно Long и обобщений либо не работали, либо не вписывались в фрагмент кода.

Я должен был решить это так (в JSP):

<%Object y=itr.next(); %>

и затем используйте мой объект y как <% = y%>, как мы использовали бы любую другую переменную Java в скриптлете.

0 голосов
/ 24 сентября 2014
long value = Long.parseLong((String)request.getAttribute(""));
...