Sobes.tech
Junior

Jak zamieniłbyś typy referencyjne na prymitywne i odwrotnie?

sobes.tech AI

Odpowiedź od AI

Dla typów referencyjnych (np. Integer, Double, Boolean) używa się automatycznego pakowania (autoboxing). JVM automatycznie konwertuje typ referencyjny na jego odpowiednik prymitywny, gdy jest to konieczne.

// Typ prymitywny
int primitiveInt = 10;

// Tworzenie typu referencyjnego z typu prymitywnego (autoboxing)
Integer objectInt = primitiveInt; // Automatyczna konwersja z int na Integer

// Konwersja typu referencyjnego z powrotem na prymitywny (auto-odpakowywanie)
int newPrimitiveInt = objectInt; // Automatyczna konwersja z Integer na int

Dla prymitywnych typów na typy referencyjne (np. int na Integer, double na Double, boolean na Boolean) stosuje się autoboxing. JVM automatycznie tworzy obiekt typu referencyjnego z wartości prymitywnej.

// Typ prymitywny
double primitiveDouble = 3.14;

// Tworzenie typu referencyjnego z typu prymitywnego (autoboxing)
Double objectDouble = primitiveDouble; // Automatyczne konwersja double na Double

// Konwersja typu referencyjnego z powrotem na prymitywny (auto-odpakowywanie)
double newPrimitiveDouble = objectDouble; // Automatyczna konwersja Double na double

Ważne jest, aby pamiętać, że podczas konwersji typu referencyjnego na prymitywny (odpakowywania) może wystąpić NullPointerException, jeśli typ referencyjny ma wartość null.

Ponadto, przed wprowadzeniem autoboxingu/autounboxing, używano jawnych metod klas opakowujących, takich jak intValue(), doubleValue(), booleanValue(), do konwersji typów referencyjnych na prymitywne, oraz konstruktorów lub metod statycznych valueOf() do konwersji prymitywnych na typy referencyjne. Autoboxing i autounboxing znacznie uprościły ten proces.

// Jawna konwersja przed autoboxing/autounboxing
Integer explicitInteger = new Integer(25); // Użycie konstruktora (przestarzałe)
int explicitInt = explicitInteger.intValue(); // Użycie metody intValue()

// Użycie metody statycznej valueOf() (zalecane)
Integer valueOfInteger = Integer.valueOf(50);
int valueOfInt = valueOfInteger.intValue();