Оператор += не определен для типов аргументов int, AtomicLong

У меня есть карта, как показано ниже -

ConcurrentHashMap<Long, AtomicLong> histogram = new ConcurrentHashMap<Long, AtomicLong>();

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

Так что теперь, если я пытаюсь перебрать ConcurrentHashMap что я упоминал выше, это всегда дает мне ошибку в этой строке

buckets[i] += histogram.get(time);

как- The operator += is undefined for the argument type(s) int, AtomicLong

Я не уверен, как я могу решить эту проблему? Я не могу вернуться и изменить структуру данных на все Integer вместо Long а также AtomicLong,

Поэтому мне нужно выяснить, как внести изменения в приведенный ниже код, чтобы он начал работать. Я думал о приведении к Integer. Но это также не работало.

Ниже мой код

private static void logHistogramInfo() {

    System.out.println("From Main Thread: " + histogram);

    int[] definition = { 0, 20, 40, 60, 80, 100 };
    int[] buckets = new int[definition.length];

    for (Long time : histogram.keySet()) {
        for (int i = definition.length - 1; i >= 0; i--) {
            if (time >= definition[i]) {
                      //error on the below line
                buckets[i] += histogram.get(time);
                break;
            }
        }
    }
    for (int i = 0; i < definition.length; i++) {
        String period = "";
        if (i == definition.length - 1) {
            period = "greater than " + definition[i] + "ms";
        } else {
            period = "between " + (definition[i] + 1) + " and " + definition[i + 1] + "ms";
        }
        System.out.println(buckets[i] + " came back " + period);
    }

}

1 ответ

Решение

+= Оператор изначально предназначался для использования с примитивными типами данных (int, long...). Поскольку их нельзя поместить в карту, классы-обертки существуют. Когда вы используете Integer или же Long с любым арифметическим оператором они автоматически "распаковываются" в соответствующий тип примитива.

Тем не менее, нет примитивного типа, соответствующего любому AtomicXYZ, Вы можете, однако, использовать любой из методов Number класс обеспечивает получение значения в качестве примитива, например longValue() или же intValue(), Обратите внимание, что значение вашего атомного длинного в принципе может быть больше самого большого int (или же Integer), так что вы можете каким-то образом справиться с потенциальным переполнением.

[править] Или вы можете использовать get() метод asylias указывает (что я не знал, так как я никогда не использовал атомные типы раньше), который делает то же самое, что и longValue() за AtomicLong (и то же самое, что intValue() за AtomicInteger), как видно из его реализации.

Другие вопросы по тегам