Оператор += не определен для типов аргументов 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
), как видно из его реализации.