06.07 Autoboxing

Unter Autoboxing versteht man die automatische Umwandlung eines primitiven Datentyps in seine Wrapper-Klasse. Autounboxing bezeichnet die automatische Umwandlung einer Wrapper-Klasse in den entsprechenden, primitiven Datentyp. Dieses Sprachfeature wurde mit der Java-Version 1.5 eingeführt.

Auto(un)boxing ist schnell erklärt und wohl kaum eines eigenen Kapitels würdig. Ein kleines Beispiel zeigt Ihnen die Möglichkeiten mit Auto(un)boxing:

public class Test {
	
  public static void main(String args[]) throws Exception {

    Test t = new Test();
	  
    int i = 42;
    Integer ig = new Integer(23);
	  
    t.doSomethingWithAnInt(i);
    t.doSomethingWithAnInt(ig); // autounboxing
	  
    t.doSomethingWithAnInteger(i); // autoboxing
    t.doSomethingWithAnInteger(ig);
  }
  
  public void doSomethingWithAnInt(int i) {
    System.out.println("I've done something with an int");
  }
  
  public void doSomethingWithAnInteger(Integer i) {
    System.out.println("I've done somthing with an Integer");
  }
}

Wird ein primitiver Datentyp erwartet, aber eine Wrapper-Klasse übergeben, wird die Wrapper-Klasse automatisch in einen primitiver Datentyp umgewandelt. Umgekehrt gilt natürlich das Selbe. Erwartet eine Anwendung eine Wrapper-Klasse, wird aber mit einem primitiven Datentyp aufgerufen, wird der primitive Datentyp automatisch in seine Wrapper-Klasse konvertiert.

Es gibt allerdings einige Sachverhalte, die beim Arbeiten mit Auto(un)boxing beachtet werden müssen. So wird bspw. nur dann konvertiert, wenn unbedingt konvertiert werden muss.

Gegeben ist eine generische Klasse (die als generischen Typen nur mit der Wrapper-Klasse arbeiten kann) mit den Methoden public generischesElement get(int pos) und public generischesElement get(generischesElement element). Angenommen Sie übergeben nun als generischen Typ einen String. In diesem Fall können Sie mit get(new Integer(1)); eindeutig die Methode public generischesElement get(int pos) ansprechen. Ist der generische Typ nun aber ein Integer, würde selbiger Aufruf die Methode public generischesElement get(generischesElement element) ansprechen.

public class Test<E> {
	
  public static void main(String args[]) throws Exception {

    Test<Integer> t = new Test<Integer>();
    t.get(23);
    t.get(new Integer(23));
   
    Test<String> t2 = new Test<String>();
    t2.get(new Integer(23));
  }
 
  public E get(int pos) {
    System.out.println("int");
    return null;
  }
  
  public E get(E element) {
    System.out.println("Element");
    return null;
  }
}

Ein weiteres Beispiel ist der Vergleich über <=, >= und ==. Bei <= und >= muss in einem primitiven Datentyp konvertiert werden (selbes gilt natürlich auch für < und > ohne Gleichheitszeichen). Mit == können aber auch Objekte verglichen werden, weshalb eine entsprechende Konvertierung nicht notwendig ist.

Integer i1 = 500;
Integer i2 = 500;
System.out.println(i1 <= i2); // true
System.out.println(i1 >= i2); // true
System.out.println(i1 == i2); // false

Hierzu kommt, dass auch in diesem Fall ein Pool (ähnlich wie bei Strings, siehe Kapitel 03.02 Strings vergleichen) verwendet wird. Dieser Pool ist bei Integern aber auf den Wertebereich eines bytes, also von -128 bis 127, beschränkt. Ein Vergleich mit == in diesem Wertebereich ergibt folglich true, ein Vergleich außerhalb false.

Integer i1 = -128;
Integer i2 = -128;
Integer i3 = 127;
Integer i4 = 127;
Integer i5 = 128;
Integer i6 = 128;
System.out.println(i1 == i2); // true
System.out.println(i3 == i4); // true
System.out.println(i5 == i6); //false
Previous Article
Next Article

2 Replies to “06.07 Autoboxing”

  1. steelsdv

    Es wäre wunderschön, wenn Sie in der Quelle kommentiert werden was ist „autoboxing“ und was ist „autounboxing“. Ansonst es ist nicht besonders klar.
    Z.b.

    		  public static void main(String args[]) throws Exception 
    		  {
    		    Test t = new Test();
    		    t.get(23);
    		    t.get(new Integer(23)); //autoboxing
    		 
    		    Test t2 = new Test();//autounboxing
    		    t2.get(new Integer(23));
    		  }

Schreibe einen Kommentar

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.