Автобоксирование довольно страшно. В то время как я полностью понимаю разницу между ==
и .equals
, я не могу не помочь, так как из-за меня все в порядке:
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 всегда автоматически распаковывается в примитив?
Печать ложных или истинных истин была бы лучше.
ИЗМЕНИТЬ
Я не согласен с поломкой старого кода. Имея foo.get(0) == bar.get(0)
return true, вы уже нарушили код.
Невозможно ли это решить на уровне компилятора, заменив Integer на int в байтовом коде (если он никогда не назначен null)