Referencje w konwersjach typu - 1

– A teraz czas na małą lekcję od Diego. Będzie krótko i na temat. O konwersjach typów referencyjnych

– Zacznijmy od zmiennych Object. Do takiej zmiennej możemy przypisać każdy typ referencyjny (konwersja rozszerzająca). Jednak, aby wykonać operację przypisania w odwrotnym kierunku (konwersja zawężająca), musisz wyraźnie wskazać operację rzutowania:

Kod Opis
String s = "mama";
Object o = s; // o przechowuje String
Typowa referencyjna konwersja rozszerzająca
Object o = "mama"; // o przechowuje String
String s2 = (String) o;
Typowa referencyjna konwersja zawężająca
Integer i = 123; // o przechowuje typ Integer;
    Object o = i;
Konwersja rozszerzająca.
Object o = 123; // o przechowuje typ Integer
String s2 = (String) o;
Błąd Runtime!
Nie można przekazać referencji Integer do referencji String.
Object o = 123; // o przechowuje typ Integer
Float s2 = (Float) o;
Błąd Runtime!
Nie można przekazać referencji Integer do referencji Float.
Object o = 123f; // o przechowuje Float
Float s2 = (Float) o;
Konwersja na ten sam typ. Referencyjna konwersja zawężająca.

– Referencyjne konwersje zawężające i rozszerzające nie zmieniają w żaden sposób obiektu. Część zawężająca (lub rozszerzająca) odnosi się konkretnie do faktu, że operacja przypisania obejmuje (lub nie obejmuje) sprawdzenie typu zmiennej oraz jej nowej wartości.

– To rzadki przypadek, kiedy wszystko jest jasne.

– Aby uniknąć błędów w tych przykładachnależy dowiedzieć się, do jakiego typu odnosi się zmienna Object:

Kod
int i = 5;
float f = 444.23f;
String s = "17";
Object o = f;                       // o przechowuje Float

if (o instanceof  Integer)
{
    Integer i2 = (Integer) o;
}
else if (o instanceof Float)
{
    Float f2 = (Float) o;            // Zostanie wykonany blok if
}
else if (o instanceof String)
{
    String s2 = (String) o;
}

– Powinieneś przeprowadzić to sprawdzenie przed każdą konwersją rozszerzającą, chyba że jesteś w 100% pewien, jakiego typu jest dany obiekt.

– Kumam.