Java Schnellstart – Type Casting

In der letzten Lektion hast du dich intensiv mit Datentypen beschäftigt. Doch was passiert, wenn du einen Datentyp in einen anderen Datentyp umwandeln musst? Diesen Prozess nennt man "Type Casting".

Was ist Type Casting?

"Type Casting" zu Deutsch für "Typumwandlung" bedeutet im Grunde nichts anderes als das du einen Wert von einem Datentyp in einen anderen umwandelst. Man unterscheidet bei der Umwandlung generell zwischen zwei Typen:

  • Explizite Typumwandlung - hier muss im Quellcode explizit auf den Datentyp verwiesen werden, weil eine verlust- bzw. fehlerfreie Umwandlung nicht immer möglich ist.
  • Implizite Typumwandlung - Bei dieser Typumwandlung muss man im Quellcode keinen zusätzlichen Verweis erbringen, weil eine Umwandlung immer funktioniert.

Implizite Typumwandlung

Schauen wir uns die implizite Typumwandlung anhand der numerischen Datentypen an. Eine Umwandlung in folgende Richtung ist immer möglich, weil der kleinere Datentyp stets in den größeren Datentyp passt:

byte --> short --> int --> long --> float --> double

Das bedeutet es ist Folgendes möglich:

class Main {
  public static void main(String[] args) {
    byte b = 100;

    // Implizite Typumwandlungen
    short s = b;
    int i = s;
    long l = i;
    float f = l;
    double d = f;

    // Eine direkte Umwandlung von byte zu double ist ebenso möglich
    double d2 = b;

    // Das funktioniert nicht
    byte b2 = d;
  }
}

Explizite Umwandlung

Möchtest du den oben beschriebenen Weg andersherum gehen, dann musst du explizit umwandeln.

Dafür musst du den jeweiligen Datentyp, auf den du wechseln möchtest, in Klammern schreiben:

class Main {
  public static void main(String[] args) {   
    // Beispiel 1
    double d = 2.89d;
    float f = (float)d;
    long l = (long)f; // Die Kommazahl wird einfach abgeschnitten
    int i = (int)f;
    short s = (short)i;
    byte b = (byte)s;
    // Beispiel 2 - Du kannst auch direkt von "double" zu "byte" wechseln
    byte b2 = (byte)d; // Komma wird abgeschnitten
    
    // Beispiel 3
    long l2 = 9999999999L;
    int i2 = (int)l2; // Die Zahl, welche in l2 gespeichert ist, ist zu groß für einen int
    System.out.println(i2); // Ausgabe: 1410065407, (Bits wurden abgeschnitten)
   
  }
}
Code ausprobieren ×

Gut zu wissen:

Wie du im obigen Code siehst, können bei der expliziten Umwandlung Informationen verloren gehen. Der Typ long kann sehr große Zahlen speichern, verbraucht jedoch 64-Bit Speicher. Möchtest du long in int umwandeln, so werden die ersten 32-Bit aus dem Datentyp  long genommen (weil ein int nur 32-Bit speichern kann). Ist die Zahl, die das int speichern soll hingegen größer, werden ggf. wichtige Daten abgeschnitten.

Prüfe daher in deinem Code, ob eine Umwandlung möglich ist.

Code-Aufgabe: Verbessere den Code

Der folgende Java-Code beinhaltet eine Methode, die aus einem alten Artikelpreis und dem neuen Artikelpreis, die Ersparnis in Prozent ausgibt. Bei manchen Zahlen kommt jedoch eine sehr lange Kommazahl heraus. Versuche das Problem zu umgehen, indem du das Komma mit der Hilfe von Type Casting entfernst. Die Lösung findest du wie immer unten.

[lp_spoiler title="Lösung anzeigen" class="da"]

Lösung:

Um das Komma zu entfernen, kannst du bspw. einen expliziten Type Cast zu "int" machen.

 
class Main {
  public static void main(String[] args) {
    int ersparnis = (int)ersparnisInProzent(1439.99f, 1199.49f);
    System.out.println(ersparnis); // Ausgabe: 16.701507568359375
  }
  public static double ersparnisInProzent(float alterPreis, float neuerPreis)
  {
    return (1f - neuerPreis / alterPreis) * 100f; // implizite konvertierung von float in double
  }
}
Code ausprobieren ×

Wie du siehst, ist der Informationsverlust, welcher bei der expliziten Typumwandlung entsteht, in diesem Fall gewünscht. Hier haben wir das Komma mit einer Umwandlung zu int entfernt. Dadurch sind Informationen (Nachkommastellen) verloren gegangen. Jedoch war uns dies bewusst.

[/lp_spoiler]

Fazit

Type Casting ist in vielen Programmen sehr nützlich. Besonders wenn du Code von anderen Programmierern benutzt und nicht immer die Methoden umschreiben willst, dann kannst du einfach Type Casting benutzen. Auch implizites Type Casting ist praktisch und kann mit minimalem Aufwand durchgeführt werden. Aus dieser Lektion solltest du das folgende Wissen mitnehmen:

  • Du kannst Datentypen explizit und implizit umwandeln
  • Bei einigen expliziten Type Casts kann es zum Informationsverlust kommen

Wir sehen uns in der nächsten Lektion!