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();