Это странное поведение:
Integer x;
x = 12;
Это из-за java autoboxing .
Немного истории:
До Java 1.5 это было запрещено. У вас были примитивы (int, char, byte, boolean, float, double,long
), а остальные в мире Java были классами (включая соответствующие оболочки: Integer, Character, Byte, Booelan, Float, Double, Long
).
Основные структуры данных Java работали с объектами, поэтому, если вам нужно было сохранить числа в списке, вам нужно было «обернуть» свое значение (обертки - это просто обычные классы, которые содержат примитивный тип)
Например, это может быть моя собственная int
оболочка:
public class Entero { // integer in spanish... :P
private final int wrappedInt;
public Entero( int i ) {
this.wrappedInt = i;
}
public int getEntero() {
return wrappedInt;
}
}
Ничего особенного, это в общих чертах, как реализованы классы "обертки" (конечно, там много служебных методов)
Итак, опять же, если вы хотите использовать его в списке (который содержит только объекты), вам придется:
List list = // get the list from somewhere....
list.add( new Integer( 1024 ) ); // wrap it
....
// use the list and at some point iterate it:
Iterator iterator = list.iterator();
while( iterator.hasNext() ) {
Integer e = ( Integer ) iterator.next(); // unwrap it
i = e.intValue();
}
Звонок
list.add( 1024 )
Непосредственно было невозможно, потому что 1024
- это литерал int
, а не объект.
Тонны кода были написаны так, по годам.
Поскольку в Java 1.5 добавлено автобоксирование, которое в основном является синтаксическим сахаром, теперь компилятор внедряет "новый Integer (i) / integer.intValue ()", и код становится следующим:
list.add( 1024 ); // wrapped in the compiled code in the the .class file that is.
....
Iterator i = list.iterator();
while( i.hasNext() ) {
int i = ( Integer ) i.next(); // unwrapped for you by the compiler under the hood
}
Удаление процесса переноса из исходного кода.
Кроме того, с помощью дженериков вы также сохранили кастинг:
List<Integer> list = .... // <- you still have to say the list is of "Integers" not "int"
....
Iterator<Integer> i = list.iterator(); // The iterator has to use the "<Integer>" generic mark
while( i.hasNext() ){
int x = i.next(); // but you can get the value directly.
}
По сути, дженерики - это знак того, что «проверьте, что используется, такого типа, и больше не отвлекайте меня от приведения», но дженерики - это еще одна тема.