Konwersja i rzutowanie typów | Kurs Java

Konwersja i rzutowanie typów

Konwersja i rzutowanie typów – W codziennym życiu nieważne jak bardzo byśmy chcieli – truskawka 🍓, nie zamieni się w cytrynę 🍋, pomimo że to i to jest owocem. Java pozwala nam na odrobinę takiej „magii” ​🧙​ i umożliwia przekształcanie jednych typów prostych w inne.

W tym materiale opowiem Ci trochę o tym czym jest konwersja oraz rzutowanie typów. Poznasz pewne zasady, o których warto pamiętać podczas przemiany jednego typu w drugi.

Java – Konwersja typu – wprowadzenie

Z tego materiału dowiesz się:

  • Czym jest konwersja typu?
  • Na czym polega rzutowanie typu?
  • Czym jest promocja typu?

Java – Konwersja typów prostych

Konwersja czyli zmiana jednego typu prymitywnego w inny, możliwa jest na dwa sposoby, poprzez:

  • poszerzanie (ang. widening) – odbywa się za pomocą konwersji typu
  • zawężanie (ang. narrowing) – odbywa się za pomocą rzutowania typu

Java – Konwersja typu (ang. type conversion)

Konwersja typu – jest to inaczej mówiąc automatyczna zmiana, przekształcenie jednego typu w drugi. Dzięki niej jeden typ danych, np. liczba całkowita, jeżeli zajdzie taka potrzeba, może zostać potraktowany jako inny typ, np. liczba zmiennoprzecinkowa.

Na poniższym przykładzie widać, jak dzieląc liczbę typu int na liczbę typu int, otrzymujemy wynik również w typie int. Jednak możemy go przypisać do typu double, dzięki niejawnej konwersji z typu int do double.

int value1 = 1;
int value2 = 2;
int value3 = value2 / value1; // = 2
double value4 = value2 / value1; // = 2.0

Taka konwersja może nastąpić tylko z typu węższego, do szerszego, czyli np. z int do long, z long do double itp., nigdy odwrotnie.

Jeżeli będziemy chcieli zrobić konwersję w dół, czyli np. z double do int, kompilator zaprotestuje błędem kompilacji: incompatible types: possible lossy conversion from double to int.

java type conversion widening

⚠️ W Javie nie jest obsługiwana automatyczna konwersja z typu numerycznego do char lub boolean. Również char i boolean nie są ze sobą kompatybilne. ⚠️

Java – Rzutowania typu (ang. type casting)

Czasami zachodzi potrzeba wymuszenia jawnie konwersji, czyli rzutowania typów. Możemy wymusić konwersję jednego typu na drugi, wykorzystując do tego konstrukcję z nawiasami okrągłymi i typem:

(nazwa typu)[zmienna]

Wymuszenie jawne konwersji należy użyć w momencie kiedy:

  • chcemy przypisać wartość większego typu danych do mniejszego typu danych tzw. zwężenie (ang. narrowing)
  • istnieje szansa na utratę precyzji wyniku podczas wykonania wyrażenia, której nie chcemy – jest to tzw. jawne rzutowanie typów w wyrażeniach (ang. Explicit Type Casting in Expressions)
  • chcemy zamienić wartość liczbową na char, lub odwrotnie.

Należy jednak być bardzo ostrożnym przy korzystaniu z tej konstrukcji, ponieważ nakazujemy wtedy kompilatorowi zmianę typu. Jeżeli taka zmiana nie będzie możliwa, możemy otrzymać wyjątek podczas działania aplikacji lub stracimy część precyzji przechowywanych danych.

int value1 = 10;
int value2 = 3;

double value3 = value2 / value1;   
double value4 = value2 / (double)value1;
int value5 = (int) 1.7;
char value6 = (char)65;
  1. value3 = 0.0
    Ponieważ najpierw podzielono 3 na 10 bez reszty, otrzymując typ int i dopiero wtedy wynik został poddany niejawnej konwersji do typu double.
  2. value4 = 0.3
    Ponieważ w wyniku dzielenia typu int przez typ double otrzymujemy wynik w postaci double.
  3. value5 =1
    Ponieważ podczas rzutowania typu z double do int utracono część ułamkową.
  4. value6 = 'A’
    Ponieważ podczas rzutowania z int do char otrzymaliśmy znak reprezentujący daną wartość liczbową

Java – Promocja typu (ang. type promotion)

Podczas wykonywania wyrażeń, może zaistnieć sytuacja, gdzie wartość pośrednia może przekroczyć zakres typu. Aby uniknąć tego typu sytuacji, podczas wykonywania wyrażenia następuje tzw. promocja typu wartości wyrażenia.

Warto wiedzieć, że:

    • Java automatycznie promuje każdy typ byte, short lub char do int podczas wykonywania wyrażenia,
    • jeśli jednym z typów jest long, float lub double, to całe wyrażenie jest promowane odpowiednio do long, float lub double.
short shortValue = 1000;

int intValue = 60000;

float floatValue = 6.55f;

double doubleValue = 0.4321;

double result = (floatValue * intValue) + (doubleValue * shortValue);

Java – Konwersja typów prostych do typów obiektowych

W ramach tego materiału zajęliśmy się przede wszystkim konwersją typów prostych – natomiast jeżeli chcesz poznać bliżej temat konwersji typów prostych do ich klas opakowujących lub do String’a zachęcam Cię do zapoznania się z poniższych materiałem: 

➡ ZOBACZ 👉: Klasy osłonowe / opakowujące

Java – Konwersja typu – podsumowanie

W ramach tego materiału dowiedzieliśmy się, na czym polega konwersja typów prostych. Bliżej zapoznaliśmy się z zagadnieniem konwersji, rzutowania oraz promocji typów prostych. Jeżeli chcesz kontynuować swoją przygodę z Javą i poznać inne struktury, które oferuję ten język programowania – to zapraszam do kolejnego tematu z serii o Javie. Wprowadzę Cię w temat tablic – struktury będącej kontenerem danych.

➡ ZOBACZ 👉: Java tablice

Kierunek Java

W serii o Javie zapoznajesz się z podstawowymi tematami o Javie. Jeżeli chcesz bardziej kompleksowo zagłębić się w temat Javy, poczytać, posłuchać o Javie, to zachęcam Cię do zapoznania się z moim kursem „Kierunek Java”:

➡ ZOBACZ 👉: Kierunek Java


20+ BONUSOWYCH materiałów z programowania

e-book – „8 rzeczy, które musisz wiedzieć, żeby dostać pracę jako programista”,
e-book – „Java Cheat Sheet”,
checklista – „Pytania rekrutacyjne”
i wiele, wiele wiecej!

Jak zostać programistą

3 komentarze
Share:

3 Comments

  1. Eoven says:

    Można w tym miejscu coś też wspomnieć o „promowaniu typów” w Javie:
    1. Jeśli dwie wartości mają różne typy Java promuje jedną wartość do wyższego typu.
    2. Np. że przy dodawaniu stałej (int) na zm. przecinkową (float) Java automatycznie promuje całkowitą do zm przecinkowej i wynik jest zm przecinkowy.
    3. Małe typy jak byte, short, char są promowane do int za każdym razem gdy są używane z operatorem arytmetycznym.
    4. Dopiero po promocji i gdy operandy mają ten sam typ zwracana wartość będzie miała ten sam typ co operandy.

  2. Artur says:

    Podany jest przykład:
    int value5 = (int) 1.7;

    czy nie powinno być:
    double value5 = (int) 1.7; skoro chcemy użyć rzutowania?

    1. Tomek says:

      Cześć Artur.
      Rozbijmy to na dwa przykłady i zobacz co się stanie:
      1.) int value5 = (int) 1.7; // 1.7 jest typu double ale castujemy na int, dlatego tracimy część liczby po przecinku
      int value5 = 1;

      2.) double value5 = (int) 1.7;
      double value5 = 1; // przypisujemy liczbę całkowitą 1 do typu double, dlatego int będzie promowany do double.
      double value5 = 1.0; // wyszło 1.0, a nie 1.7 ponieważ w poprzednim kroku pozbyliśmy się części ułamkowej.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *