2010-01-04 4 views
2

, 하나는 다른 확장 :왜이 ClassCastException이 발생합니까? 내가이 개 매우 간단한 수업을

public class LocationType implements Parcelable { 
    protected int locid = -1; 
    protected String desc = ""; 
    protected String dir = ""; 
    protected double lat = -1000; 
    protected double lng = -1000; 

    public LocationType() {} 

    public int getLocid() { 
     return locid; 
    } 

    public void setLocid(int value) { 
     this.locid = value; 
    } 

    public String getDesc() { 
     return desc; 
    } 

    public void setDesc(String value) { 
     this.desc = value; 
    } 

    public String getDir() { 
     return dir; 
    } 

    public void setDir(String value) { 
     this.dir = value; 
    } 

    public double getLat() { 
     return lat; 
    } 

    public void setLat(double value) { 
     this.lat = value; 
    } 

    public double getLng() { 
     return lng; 
    } 

    public void setLng(double value) { 
     this.lng = value; 
    } 



    // ********************************************** 
    // for implementing Parcelable 
    // ********************************************** 

    @Override 
    public int describeContents() { 
     return 0; 
    } 

    @Override 
    public void writeToParcel(Parcel dest, int flags) { 
     dest.writeInt (locid); 
     dest.writeString(desc); 
     dest.writeString(dir ); 
     dest.writeDouble(lat ); 
     dest.writeDouble(lng ); 
    } 

    public static final Parcelable.Creator<LocationType> CREATOR = new Parcelable.Creator<LocationType>() { 
     public LocationType createFromParcel(Parcel in) { 
      return new LocationType(in); 
     } 

     public LocationType[] newArray(int size) { 
      return new LocationType[size]; 
     } 
    }; 

    private LocationType(Parcel dest) { 
     locid = dest.readInt (); 
     desc = dest.readString(); 
     dir = dest.readString(); 
     lat = dest.readDouble(); 
     lng = dest.readDouble(); 
    } 
} 

과 :

public class MyLocationType extends LocationType { 
    private ArrayList<ArrivalType> mArrivals = new ArrayList<ArrivalType>(); 

    public List<ArrivalType> getArrivals() { 
     return mArrivals; 
    } 

    public void addArrival(ArrivalType arrival) { 
     mArrivals.add(arrival); 
    } 
} 

문제는 내가 MyLocationTypeLocationType의 인스턴스를 캐스팅 할 때 나는 ClassCastException를 얻을입니다. 왜 이런거야?

답변

7

LocationType은 수퍼 클래스이므로, 서브 클래스에 캐스트 할 수 없습니다.

조금 더 설명하려면 : 상속 트리 만 캐스팅 할 수 있습니다. 즉, 객체는 생성 된 클래스 유형, 해당 수퍼 클래스 또는 구현 된 인터페이스로만 형 변환 될 수 있습니다 . 따라서, StringString 또는 Object으로 캐스팅 될 수 있습니다. HashMapHashMap, AbstractMapMap 또는 Object으로 주조 할 수 있습니다. 귀하의 경우에는

하는 MyLocationType은 약 중 하나 MyLocationType 또는 LocationType (또는 Object), 그러나 다른 방법이 될 수 있습니다.

Java docs on inheritance 여기를 검토하기 만하면됩니다.

1

LocationTypeMyLocationType의 인스턴스가 아니기 때문에 이것은 부모입니다. 예를 들어 LocationType에없는 MyLocationType에 새 메서드를 추가 한 다음 LocationType에서 MyLocationType을 캐스팅하면 LocationType에없는 새 메서드가 호출되면 어떻게 될까요?

MyLocationTypeis aLocationType하지만 LocationTypeMyLocationType 없습니다.

1

MyLocationType 유형 LocationType이며 하나에 캐스팅 될 수 있기 때문에,하지만 LocationTypeMyLocationType의하지과 그에은 캐스팅 할 수 없습니다.

0

당신이 경우에 노력하고 참조가 하지 MyLocationType

이 샘플의 인스턴스이기 때문에 항상 나에게 무슨 일이 일어나고 있는지 생각하는 데 도움이됩니다.

Object o = new Object(); 

    String s = (String) o; 

문자열은 모든 객체는 문자열 (또는이 경우에는 "주조"개체가 있다는 문자열) 아래

1
LocationType lt = new LocationType(); 
MyLocationType myLt = new MyLocationType(); 

LocationType t1 = (LocationType)lt; // OK, but cast not required 
LocationType t2 = (LocationType)myLt; // OK, but cast ALSO not required 
MyLocationType t3 = (MyLocationType)lt; 

// ClassCastException, MyLocationType extends (is-a) LocationType, 
// not the other way around 
MyLocationType t3 = (MyLocationType)lt; 

MyLocationType t5 = (MyLocationType)myLt; // OK, but cast not nessecary 

명시 적 캐스팅는 것을 의미하지 않는다 Object에서 상속 있지만 나무가 거의 필요하지 않습니다, 그리고 나무까지 위험하다 : 당신이 특정 서명을 가진 메소드를 오버라이드 (override)하는 경우

public void doThis(LocationType lt) { 
    MyLocationType myLt = (MyLocationType)lt; // DANGEROUS 
} 

이런 종류의 물건 만 수행해야합니다, 심지어 일 너는 확인해야한다 :

@Override 
public void doThis(LocationType lt) { 
    if (lt instanceof MyLocationType) { 
    MyLocationType myLt = (MyLocationType)lt; 
    } else { 
    // A LocationType but not MyLocationType 
    doSomethingElse(lt); 
    } 
} 
관련 문제