Приведите int к long в Java - PullRequest
       2

Приведите int к long в Java

0 голосов
/ 05 марта 2019

На эти вопросы есть много ответов, и я их видел.У меня есть код, который работал, но сегодня неожиданно он начинает выдавать java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Long для строки

return null == input.get(keyName) ? 0L : (long) input.get(keyName);

Ошибка исходит от (long) input.get(keyName).Я удивляюсь, почему это начало ломаться внезапно.(long) input.get(keyName) это выглядит хорошо для меня.Я думал о ((Integer) input.get(keyName)).longValue(), но получал java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.Integer, поскольку карта иногда содержит long значений.Любые предложения

Stacktrace:

java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Long
    at accountservice.adapter.batch.testJob.SyncDriverPartitioner.getLongValueFromMap(SyncDriverPartitioner.java:78) ~[classes/:?]
    at accountservice.adapter.batch.testJob.SyncDriverPartitioner.partition(SyncDriverPartitioner.java:47) ~[classes/:?]
    at accountservice.adapter.batch.testJob.SyncDriverPartitioner$$FastClassBySpringCGLIB$$6f3315e4.invoke(<generated>) ~[classes/:?]
    at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) ~[spring-core-4.3.18.RELEASE.jar:4.3.18.RELEASE]

Ответы [ 2 ]

0 голосов
/ 06 марта 2019

Вместо того, чтобы приводить int к long, я бы предложил:

return null == input.get(keyName) ? 0L : Integer.toUnsignedLong(input.get(keyName))

По крайней мере, таким образом вы должны получить больше информации о том, почему его нельзя преобразовать в long, а не просто в ClassCastException

Обновление ответа

На основании ваших комментариев, я думаю, вам придется проверить тип записи в Map, прежде чем обрабатывать ее, я бы предложилследующее:

    Object keyValue = input.get(keyName);
    if (null == keyValue) return 0L;
    String valueType = keyValue.getClass().getTypeName();
    if (valueType.equals(Long.class.getTypeName())) {
        return (long) keyValue;
    }
    if (valueType.equals(Integer.class.getTypeName())) {
        return Integer.toUnsignedLong((int) keyValue);
    }
    throw new TypeMismatchException(String.format("Type '%s' is not supported...", valueType));

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

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

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

0 голосов
/ 05 марта 2019

Вы можете воспользоваться тем, что все числовые примитивные оболочки расширяются java.lang.Number:

return null == input.get(keyName) ? 0L : ((Number) input.get(keyName)).longValue();

Относительно того, почему он начал выдавать ошибки внезапно;на самом деле единственной вероятной причиной является то, что до тех пор, пока она не начала давать сбой, вы всегда помещали java.lang.Long объекты на карту input, и она менялась, поэтому вы также добавляете в них java.lang.Integer.

Это довольно легко сделать с помощью автобокса и числовых констант:

long v = 42;
input.put("key", v);  // Puts a java.lang.Long in the map
input.put("key", 42); // Puts a java.lang.Integer in the map
input.put("key", 42L); // Puts a java.lang.Long in the map

Этого можно избежать, объявив тип карты безопасно (Map<String, Long>).Если вы сделаете это, input.put("key", 42) выдаст ошибку во время компиляции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...