![]()
W codziennej pracy z Java spotykamy się z różnymi typami danych – od prostych licz całkowitych, przez liczby zmiennoprzecinkowe, aż po tekst i znaki. Często napotykamy na potrzebę zmiany danych z jednego typu na inny, żeby móc je porównać, policzyć, wyświetlić użytkownikowi lub przesłać dalej. Dlatego też sięgamy do tematu konwersji typów danych, która będzie przedmiotem dzisiejszej lekcji. Dowiesz się z niej dlaczego Java pilnuje zgodności typów danych, jakie są rodzaje konwersji, jak bezpiecznie zmieniać typy liczbowe i tekstowe oraz na co uważać, żeby nie stracić danych lub nie dostać niespodziewanego błędu.
Wprowadzenie
Konwersja typów danych w Javie to jedna z podstawowych umiejętności, którą powinien opanować każdy tester i programista. Niezależnie od tego, czy pracujesz z testami automatycznymi, czy przygotowujesz dane testowe, prędzej czy później trafisz na moment, w którym trzeba „zamienić” np. String na int, albo double na int. Bo wyobraź sobie, że np. chcesz zmienić liczbę zmiennoprzecinkową (np. 3.14) na liczbę całkowitą (np. 3) albo połączyć liczbę z tekstem. Właśnie do tego służą konwersje i rzutowanie typów.
Java to język programowania z ścisłą kontrolą typów, co oznacza, że przed przypisaniem wartości do zmiennej Java sprawdza typ danych zmiennej i wartości i próbuje ustalić, czy są one zgodne.
int a; short b - 3.2; a = b;
Przykład:
Próbujemy zapisać wartość typu double w zmiennej typu int co będzie skutkować wyświetleniem komunikatu o błędzie.

int a; short b = 2; a = b;
Tym razem próbujemy zapisać wartość typu short w zmiennej typu int, a kompilator na to pozwala i nie wyświetla komunikatu o błędzie.

Zgodnie z powyższym widzimy, że nie wszystkie instrukcje z różnymi typami danych są odrzucane przez kompilator. Typ danych double może przechowywać ułamki i wartości dużo większe niż int. Zapis wartości jest więc niemożliwy ze względu na zagrożenie utraty danych. Proste typy danych mają określoną hierarchię. Jeśli określony typ znajduje się wyżej w hierarchii oznacza to, że może przechowywać większe liczby.
Hierarchia prostych typów danych (od najwyższej do najniższej) wygląda następująco:
- double
- float
- long
- int
- short
- byte
Konwersja poszerzająca zakres
Jest to bezpieczna konwersja automatyczna mniejszego typu danych na większy, gdy nie ma ryzyka utraty danych.
byte a =10; int b = a; double c = b;
int pomieści wszystko, co może przechowywać byte, a double wszystko, co int.
Konwersja zawężająca zakres
Następuje próba konwersji większego typu na mniejszy (z niższego poziomu hierarchii). Przykładem może być przekształcenie wartości typu double na wartość typu int. Ponieważ taka konwersja może prowadzić do utraty danych Java nie wykonuje ich automatycznie. Aby wykonać taką konwersję (rzutowanie) należy użyć operatora rzutowania .
Rzutowanie wykonujemy za pomocą nawiasów z nazwą typu umieszczonych przed przekształcaną wartością:
(int) zmienna (byte) liczba
Przykład 1:

Uwaga: przy rzutowaniu można stracić dane, jeśli nowy typ ma mniejszy zakres.
Przykład 2:

Działania na różnych typach liczbowych
Java automatycznie podnosi typy danych, gdy łączysz różne liczby w jednym wyrażeniu:
byte a = 10; int b = 100; int wynik = a + b; // byte + int → int
W praktyce:
| WYRAŻENIE | WYNIKOWY TYP |
| byte + byte | int |
| short + int | int |
| int + long | long |
| int + double | double |
Przykłady rzutowania:
public class Rzutowanie { public static void main(String[] args) { // Automatyczna konwersja int liczba = 42; double zmiennoprzecinkowa = liczba; System.out.println(zmiennoprzecinkowa); // 42.0 // Jawne rzutowanie double cena = 19.99; int cenaZaokraglona = (int) cena; System.out.println(cenaZaokraglona); // 19 // Rzutowanie z utratą danych int duzaLiczba = 130; byte malaLiczba = (byte) duzaLiczba; System.out.println(malaLiczba); // -126 (przepełnienie typu byte) } }
Uwaga: Przy rzutowaniu do mniejszych typów może dojść do przepełnienia – Java „zawija” wartość do dostępnego zakresu.
Konwersja tekstu na liczby i odwrotnie
String → int
String tekst = “123”; int liczba = Integer.parseInt(tekst);
int → String
int liczba = 42; String tekst = String.valueOf(liczba);
String → double
Używamy metody Double.parseDouble(String), aby przekonwertować tekst na liczbę zmiennoprzecinkową.
String saldo = "99.50"; double saldoDouble = Double.parseDouble(saldo); // 99.5
Uwaga: jeśli w Stringu będzie coś czego nie da się poprawnie zamienić (np. „abc”), otrzymasz NumberFormatException.
Wyrażenia mieszane (różne typy w działaniu)
Kiedy w jednym wyrażeniu występują różne typy liczbowe np. int i double, wynik przyjmuje typ szerszy (double).
int a = 5; double b = 2.5; double wynik = a + b; // int + double = double System.out.println(wynik); // 7.5
Aby wykonać działania z zachowaniem typu (np. do dalszych obliczeń), możesz jawnie rzutować wynik:
int wynik2 = (int) (a + b); // rzutowanie double + int System.out.println(wynik2); //rzutowanie na koniec: wynik = 7
Uwaga: Rzutowanie nie zaokrągla, tylko obcina część dziesiętną. Jeśli chcesz zaokrąglać, użyj Math.round() lub innych metod z Math.
Podsumowanie
Java wykonuje wiele konwersji automatycznie, ale zrozumienie mechanizmów pomaga uniknąć błędów i pisać lepszy kod. Rzutowanie to sposób na świadome zarządzanie typami danych.
Zawsze uważaj przy rzutowaniu w dół (np. double -> int) – może dojść do utraty dokładności (obcięcie części dziesiętnej) lub przepełnienia, czyli sytuacji w której wartość liczby przekracza maksymalny zakres danego typu danych (np. long -> int przy bardzo dużych liczbach).
W przypadku przepełnienia liczba „zawija się” do wartości z drugiego końca zakresu (czyli staje się błędna np. z wartości dodatniej na ujemną), a my nie dostajemy błędu ani wyjątku, ale wynik jest niepoprawny logicznie.
W kolejnych artykułach z kursu Javy znajdziesz jeszcze więcej praktycznych przykładów, które pomogą Ci lepiej zrozumieć ten język i mieć niezbędne informacje zawsze pod ręką – również w formie pseudokodu.
Zaglądaj do sekcji kursu regularnie, by systematycznie poszerzać swoją wiedzę o Javie!
O autorze
Tester oprogramowania z pasją do jakości i technologii. Łączy doświadczenie w testach manualnych i automatycznych, koncentrując się przede wszystkim na aplikacjach webowych oraz usługach SOAP i REST. Testowanie to dla niego nie tylko szukanie błędów, ale przede wszystkim kwestionowanie przyjętych założeń i usprawnianie tego, co nie działa – również w samym procesie testowym. Lubi zmieniać, angażować się i aktywnie budować proces testowy, tak by miał sens, a nie tylko formę. Prywatnie fan rocka, biwakowania, podróży.
