java.lang.Integer не может быть приведен к java.lang.Long - PullRequest
1 голос
/ 23 сентября 2019

Я должен получить длинное целое число в своем веб-сервисе.

long ipInt = (long) obj.get("ipInt");

Когда я тестирую свою программу и устанавливаю значение ipInt = 2886872928, это дает мне успех.Однако, когда я тестирую свою программу и устанавливаю значение ipInt = 167844168, это выдает мне ошибку:

java.lang.ClassCastException: java.lang.Integer не может быть приведен к java.lang.Long

Ошибка указывает на приведенный выше код.

К вашему сведению, мои данные в формате JSON:

{
    "uuID": "user001",
    "ipInt": 16744168,
    "latiTude": 0,
    "longiTude": 0,
}

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

Ответы [ 3 ]

4 голосов
/ 23 сентября 2019

Оба Integer и Long являются подклассами Number, поэтому я подозреваю, что вы можете использовать:

long ipInt = ((Number) obj.get("ipInt")).longValue();

Это должно работать, если значение, возвращаемое obj.get("ipInt"), равно Integerссылка или Long ссылка.Недостатком является то, что он будет также молча продолжаться, если ipInt было указано как число с плавающей запятой (например, "ipInt": 1.5) в JSON, где вы можете вместо этого выдать исключение.

Вы могли бы использовать вместо этого instanceof для проверки Long и Integer конкретно, но это было бы довольно уродливо.

1 голос
/ 23 сентября 2019

Мы не знаем, что возвращает obj.get(), поэтому сложно сказать точно, но когда я использую такие методы, которые возвращают Number подклассы, я считаю более безопасным привести его к Number и вызвать соответствующий xxxValue(), вместо того, чтобы позволить автоматическому распаковыванию бросить ClassCastException:

long ipInt = ((Number)obj.get("ipInt")).longValue();

Таким образом, вы делаете явную распаковку на long и можете справиться с данными, которые могут включать., который вместо этого возвращает Float или Double.

0 голосов
/ 23 сентября 2019

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

long ipInt;
Object o = obj.get("ipInt");
if (o instanceof Integer) {
    ipInt = ((Integer) o).intValue();
} else if (o instanceof Long) {
    ipInt = ((Long) o).longValue();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...