Frage

Diese Frage ist über „Warum tut Autoboxing einige Anrufe in Java mehrdeutig machen? "

Aber das Lesen durch die Antworten, gibt es eine Reihe von Hinweisen auf Casting und ich bin nicht sicher, ob ich völlig den Unterschied verstehen.

Kann jemand eine einfache Erklärung liefern?

War es hilfreich?

Lösung

Boxen ist, wenn Sie einen primitiven Typ in einen Referenztyp, un-Boxen konvertieren ist das Gegenteil. Casting ist, wenn Sie ein Typ wollen als eine andere Art behandelt werden, zwischen primitiven Typen und Referenztypen bedeutet dies einen impliziten oder expliziten Boxen Betrieb. Ob es muss explizit sein ist eine Sprache-Funktion.

Andere Tipps

Sowohl Gießen und Box / Unboxing haben mit Typen und offensichtlich (oder real) Umwandlung zu tun, aber Boxen / Unboxing ist spezifisch für die Beziehung zwischen primitiven Typen und ihren entsprechenden Wrapper-Typen, während Gießen der Begriff für explizite oder implizite Änderung ist der Typ im allgemeineren Sinn.

Casting ist ein allgemeiner Begriff mit zwei verwandten-but-verschiedenen Bedeutungen:

  1. einen Wert eines Typs Behandlung von als ob Sie ihm den Wert eines anderen Typs waren. Zwei Beispiele dieser ersten Verwendungen sind:

    1.1. Da die Klasse B Klasse A erstreckt, können Sie für myB fragen eine Instanz von B als Instanz von A behandelt werden durch ((A) myB) schreiben, wo immer ein Verweis auf eine Instanz von A erscheinen könnte. Dies gilt eigentlich nicht eine neue Instanz von A erzeugen.

    1.2. Pre-Java5 Sammlungen alle Inhalte als Object gespeichert; dies erforderlich Sie in der Regel eine Besetzung nach dem Abrufen eines Objekts aus einer Sammlung zu verwenden. Zum Beispiel, wenn Sie eine String in einem Map gespeichert hatten und brauchten seine Länge zu erhalten, würden Sie so etwas wie ((String) myMap.get(someKey)).length() zu schreiben, wo die Besetzung wäre erforderlich, um die length Methode von String zu nennen. Auch hier ist dies kein neues String verursachen geschaffen werden.

  2. Explizit Umwandeln einem Typ zum anderen (das heißt die Darstellung explizit ändern). Ein Beispiel für diese zweite Verwendung ist in dem Ausdruck ((int) (float_var + 0.5F)) die rundet eine Gleitkommavariable durch Zugabe von 0,5 (die einen Gleitkommawert erzeugt) und dann diesen Wert explizit in eine Ganzzahl umzuwandeln. Die sich ergebende ganzzahlige Wert (nach dem (int) cast) ist erzeugt von dem anderen Wert, der durch interne Berechnung.

Gießen durchgeführt werden kann, wenn es eine übergeordnete Klasse / Unterklasse oder Schnittstelle / Implementierer Beziehung (dh 1 oben) oder wenn die beiden Typen primitive numerische Typen (dh 2). Sie könnten „Erweiterung“ und „Verengung“ für weitere Details nachzuschlagen.

Boxen bezieht sich auf primitive Typen in Containerobjekten Einwickeln, in der Regel nur dann, wenn Sie ein Objekt haben muss (beispielsweise einen Wert in einer Sammlung zu speichern). Die primitiven und Wrapper-Typen kommen paarweise:

int      Integer
long     Long
boolean  Boolean
...      ...

Unboxing bedeutet einfach den Grundwert aus seinem Objekt-Wrapper abgerufen werden.

Ab Java5, wenn Sie einen Ausdruck schreiben, die einen Grundwert verwendet, wo der entsprechende Wrapper-Typ (wie Putting eine ganze Zahl in eine Sammlung) erforderlich wäre, der Compiler rutscht automatisch in dem Code, dass primitiven Wert tatsächlich umschließt. Ebenso wird es das Abwickeln Code für Sie.

Also statt des Schreibens (in Pre-Java5) so etwas wie:

Map myMap = new HashMap();
...
myMap.put(someKey,Integer.valueOf(3));
...
int nextValue = (myMap.get(someKey)).intValue() + 1;

können Sie schreiben:

Map<KeyType,Integer> myMap = new HashMap<KeyType,Integer>();
...
myMap.put(someKey,3);
...
int nextValue = myMap.get(someKey) + 1;

und die Boxen / Unboxing-Code wird vom Compiler eingefügt.

List<String> list = (List<String>)object;

ist ein gegossenes.

void doSomething(Integer i) { ... }
...
doSomeething(5);

sind Auto-Boxen.

Integer getSomething();
...
int i = getSomething();

ist Auto-Unboxing.

Autoboxing wurde in Java 5 eingeführt Code zu verhindern, wie zum Beispiel:

map.put("ABC", new Integer(5));
map.put("DEF", new Integer(6));

Sie können jetzt sagen:

map.put("ABC", 5);

Während es einfacher -. Es hat einige Tücken, wenn Sie nicht ganz sicher sind, was Sie tun

Boxen ist ein Wert in einem Container Verpackung, wie ein int Grundwert innerhalb eines Integer-Objekt

Gießen ist nur, wie bei der Art suchen.

Die ehemaligen ein andere Art von Wert erzeugt, die später nur modifizieren, wie einen bereits bestehenden Wert behandeln

zwischen primitiven Typen modifiziert tatsächlich ihre Darstellung Außer Gießen. (Dies macht es nicht klarer nicht wahr?)

Boxen und Unboxing ist eine Art von Guss in Java, wo Sie von einem primitiven gieße seiner Wrapper-Klasse oder den inversen, z.B. boolean Boolean (Box) oder Boolean boolean (unbox).

Typen von Abgüssen in Java, mit Beispiel:

  • eine Identitätsumwandlung (§5.1.1) String String

  • eine Verbreiterung primitive Umwandlung (§5.1.2) Byte int

  • eine Verengung primitive Umwandlung (§5.1.3) int Byte

  • eine Verbreiterung Referenzumwandlung (§5.1.5) Integer Ziffer

  • eine Verengung Referenzkonvertierung (§5.1.6) Nummer Integer

  • eine Box-Konvertierung (§5.1.7) int Integer

  • eine Unboxing-Umwandlung (§5.1.8). Integer int

oder Autoboxing autounboxing passiert, wenn der Compiler die für Sie Boxen / Unboxing-Konvertierung tut (es ist nicht explizit im Quellcode als Guss Ausdruck angezeigt wird), z.B. finden Sie in der Frage, die Sie bezeichnet.

Does Autoboxing und Unboxing kann im folgenden Fall angewendet werden?

Long one = 10;
long two = 15;
Long three = 20;

if(one == three) //will this be unboxed or do we need to put a explicit
                 //condition like if(one.intValue() == three.intValue()) 
   System.out.println("Equal");
else 
   System.out.println("Not Equal");  


if(one == two) //will this be unboxed or do we need to put a explicit
               //condition like if(one.intValue() == two) 
   System.out.println("Equal");
else 
   System.out.println("Not Equal");  
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top