Kategorie szkoleń | Egzaminy | Kontakt

Odpowiedź (1)

  • 3

 Wszystko zależy od tego, na jaki typ obiektu wskazuje nasza referencja. Rzutowanie powiedzie się, jeżeli rzutowana zmienna referencyjna wskazuje na obiekt, który jest identycznego typu jak referencja docelowa. Taka operacja powiedzie się również, gdy obiekt wskazywany przez zmienną referencyjną jest podklasą typu referencji docelowej. Weźmy takie proste przykłady:


public interface Rozmiar {}
public class Figura implements Rozmiar {}
public class Kolo extends Figura {}
public class CustomKolo extends Kolo {}

Figura f1 = new Figura();
Figura f2 = new Kolo();
Figura f3 = new CustomKolo();

1. Kolo kolo = (Kolo)f2; //OK
2. Kolo kolo = (Kolo)f3; //OK
3. Kolo kolo = (Kolo)f1; //ClassCastException
4. Rozmiar rozmiar = (Rozmiar)f1; //OK


W pierwszym przypadku rzutowanie powiedzie się, ponieważ referencja f2 wskazuje na obiekt, który jest tego samego typu, co klasa "Kolo".
W drugim przypadku rzutowanie powiedzie się, ponieważ referencja f3 wskazuje na obiekt, który dziedziczy z klasy "Kolo".
W trzecim przypadku rzutowanie nie powiedzie się, ponieważ referencja f1 wskazuje na obiekt, który jest nadklasą klasy "Kolo". W momencie uruchomienia otrzymamy wyjątek: ClassCastException.
W czwartym przypadku rzutowanie powiedzie się, ponieważ referencja f1 wskazuje na obiekt, który implementuje interfejs "Rozmiar".

  • Odpowiedział
  • @ | 25.06.2013
  • TRENER ALTKOM AKADEMII