Autoboxing довольно страшно. В то время как я полностью понять разницу между ==
и .equals
я не могу не помочь иметь последующую ошибку чёрта из меня:Почему компилятор/JVM просто не делает autoboxing «просто работать»?
final List<Integer> foo = Arrays.asList(1, 1000);
final List<Integer> bar = Arrays.asList(1, 1000);
System.out.println(foo.get(0) == bar.get(0));
System.out.println(foo.get(1) == bar.get(1));
Это печатает
true
false
Почему они делают это таким образом? Это как-то связано с кешированными целыми, но если это так, почему бы им не кэшировать все целые числа, используемые программой? Или почему JVM всегда автоматически распаковывается в примитив?
Печать ложных или истинных истин была бы лучше.
EDIT
Я не согласен о поломке старого кода. Имея foo.get(0) == bar.get(0)
return true, вы уже нарушили код.
Не может это быть решена на уровне компилятора, заменив Integer с междунар в байт-код (до тех пор, как он никогда не назначается нуль)
это как раз работа !! не так, как вы ожидали;) – OscarRyz
На самом деле ваш пример мало связан с автобоксингом, это поведение предшествует ему. Это правда, что autoboxing заставляет нас больше знать об этом: equals() является (обычно правильным) способом сравнения объектов, == является (единственным) способом сравнения примитивов ... autoboxing помогает программисту обрабатывать Integer и int (почти) взаимозаменяемо ... и, следовательно, опасность ошибок здесь. – leonbloy
Это может быть связано с особенностями, которые также влияют на экземпляры String. Насколько я понимаю, в зависимости от ценности происходит некоторая группировка за кулисами.Это можно предотвратить, используя ключевое слово 'new'. –