Dieses seltsame Verhalten:
Integer x;
x = 12;
Ist aufgrund java autoboxing.
Einige Geschichte:
Vor Java 1.5 es war nicht erlaubt.Sie hatten Primitive (int, char, byte, boolean, float, double,long
) und der Rest in der Java-Welt waren Klassen (einschließlich der entsprechenden Wrapper: Integer, Character, Byte, Booelan, Float, Double, Long
).
Die Kerndatenstrukturen von Java mit Objekten gearbeitet, also wenn Sie benötigten Zahlen in eine Liste zu speichern, man mußte „wrap“ Ihren Wert (die Wrapper nur reguläre Klassen sind, die eine primitive Art halten)
Für Beispiel kann dies mein eigener int
Wrapper sein:
public class Entero { // integer in spanish... :P
private final int wrappedInt;
public Entero(int i) {
this.wrappedInt = i;
}
public int getEntero() {
return wrappedInt;
}
}
Nichts Besonderes, das ist ganz allgemein, wie die „Wrapper“ Klassen implementiert werden (natürlich gibt es dort viele Hilfsmethoden)
Also noch einmal, , ob Sie wollte es in einer Liste verwenden (die nur Objekte enthält) auf Sie haben:
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)
direkt nicht möglich war, Berufung, weil 1024
ein int
wörtlichen ist, nicht ein Objekt.
Tonnen Code wurden so geschrieben, nach Jahren.
Seit Java 1.5 hinzugefügt Autoboxing, die im Grunde syntaktischer Zucker ist, jetzt "new Integer (i)/integer.intValue()" werden vom Compiler unter der Haube eingespritzt und der Code wurde:
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
}
Entfernen der Wrapping-Prozess aus dem Quellcode.
Zusätzlich mit Generika, gespeichert Sie das Casting auch:
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.
}
Grundsätzlich Generika eine Marke ist zu sagen, „überprüfen, was von dieser Art gewöhnt ist und stört mich nicht mit Casting mehr“, aber Generika sind ein anderes Thema.
thx für eine gute Erklärung. ist String s = Integer.toString (12); das Gleiche wie String s = Integer (12) .toString(); – ajsie
@danben: nein, du bist inkorrekt http://bit.ly/6Nt8D1 – cletus