Sobes.tech
Junior

Jak byste převedli referenční typy na primitivní a naopak?

sobes.tech AI

Odpověď od AI

Pro referenční typy (například Integer, Double, Boolean) se používá auto-boxing (automatické zabalení) u primitivních typů (int, double, boolean). JVM automaticky převádí referenční typ na jeho ekvivalentní primitivní typ, když je to potřeba.

// Primitivní typ
int primitiveInt = 10;

// Vytvoření referenčního typu z primitivního (auto-boxing)
Integer objectInt = primitiveInt; // Automatická konverze z int na Integer

// Převod referenčního typu zpět na primitivní (auto-unboxing)
int newPrimitiveInt = objectInt; // Automatická konverze z Integer na int

Pro primitivní typy na referenční typy (například int na Integer, double na Double, boolean na Boolean) se používá auto-boxing. JVM automaticky vytvoří objekt referenčního typu z primitivní hodnoty.

// Primitivní typ
double primitiveDouble = 3.14;

// Vytvoření referenčního typu z primitivního (auto-boxing)
Double objectDouble = primitiveDouble; // Automatická konverze z double na Double

// Převod referenčního typu zpět na primitivní (auto-unboxing)
double newPrimitiveDouble = objectDouble; // Automatická konverze z Double na double

Je důležité si pamatovat, že při převodu referenčního typu na primitivní (auto-unboxing) může dojít k NullPointerException, pokud má referenční typ hodnotu null.

Navíc, před zavedením auto-boxing a auto-unboxing se používaly explicitní metody wrapper tříd, jako intValue(), doubleValue(), booleanValue(), k převodu referenčních typů na primitivní, a konstruktor nebo statické metody valueOf() k převodu primitivních typů na referenční. Auto-boxing a auto-unboxing tento proces výrazně zjednodušily.

// Explicitní převod před auto-boxingem/auto-unboxingem
Integer explicitInteger = new Integer(25); // Použití konstruktoru (zastaralé)
int explicitInt = explicitInteger.intValue(); // Použití metody intValue()

// Použití statické metody valueOf() (preferované)
Integer valueOfInteger = Integer.valueOf(50);
int valueOfInt = valueOfInteger.intValue();