Conversii tip de referință - 1

"Și acum, o scurtă lecție de la Diego. Scurtă și la obiect. Despre conversiile tipului de referință."

„Să începem cu variabilele Object. Puteți aloca orice tip de referință unei astfel de variabile ( conversie de lărgire ). Cu toate acestea, pentru a face alocarea în cealaltă direcție ( conversie de îngustare ), trebuie să indicați în mod explicit o operație de turnare:”

Cod Descriere
String s = "mom";
Object o = s; // o stores a String
O conversie tipică de referință de extindere
Object o = "mom"; // o stores a String
String s2 = (String) o;
O conversie tipică de referință de îngustare
Integer i = 123; // o stores an Integer
Object o = i;
Lărgirea conversiei.
Object o = 123; // o stores an Integer
String s2 = (String) o;
Eroare de rulare!
Nu puteți arunca o referință Integer la o referință String.
Object o = 123; // o stores an Integer
Float s2 = (Float) o;
Eroare de rulare!
Nu puteți arunca o referință Integer la o referință Float.
Object o = 123f; // o stores a Float
Float s2 = (Float) o;
Conversie la același tip. O conversie de referință care se îngustează.

O conversie de referință de lărgire sau îngustare nu schimbă obiectul în niciun fel. Partea de îngustare (sau lărgire) se referă în mod specific la faptul că operația de atribuire include (nu include) verificarea de tip a variabilei și a noii sale valori. "

„Acesta este exemplul rar în care totul este clar”.

„Pentru a evita erorile din aceste exempleavem o modalitate de a afla ce tip este referit de variabila Object:

Cod
int i = 5;
float f = 444.23f;
String s = "17";
Object o = f;                       // o stores a Float

if (o instanceof  Integer)
{
    Integer i2 = (Integer) o;
}
else if (o instanceof  Float)
{
    Float f2 = (Float) o;            // This if block will be executed
}
else if (o instanceof  String)
{
    String s2 = (String) o;
}

„Ar trebui să efectuați această verificare înainte de fiecare conversie de extindere, cu excepția cazului în care sunteți 100% sigur de tipul obiectului.”

"Am înţeles."