It is illegal in Java to cast an array of a supertype into an array of a subtype.
On Thu, Jul 2, 2009 at 11:42 PM, ade<a.wirayu...@gmail.com> wrote: > > Hello Android Developers, > > Why do I get java.lang.ClassCastException when I tried to cast back > an array of custom object that implements Parcelable? > > Here is the custom class: > > public class Placemark implements Parcelable { > public Double latitude; > public Double longitude; > public Double distanceFromUser; > public int accuracy; > public String address; > private static final int earthRadius = 6371; > > public static final Parcelable.Creator<Placemark> CREATOR = new > Parcelable.Creator<Placemark>() { > public Placemark createFromParcel(Parcel in) { > return new Placemark(in); > } > > public Placemark[] newArray(int size) { > return new Placemark[size]; > } > }; > > public Placemark(JSONObject jo) throws JSONException { > this.address = jo.getString("address"); > JSONArray array = jo.getJSONObject("Point").getJSONArray( > "coordinates"); > this.latitude = array.getDouble(1); > this.longitude = array.getDouble(0); > this.accuracy = array.getInt(2); > } > > public Placemark(JSONObject jo, Location userLocation) > throws JSONException { > this.address = jo.getString("address"); > JSONArray array = jo.getJSONObject("Point").getJSONArray( > "coordinates"); > this.latitude = array.getDouble(1); > this.longitude = array.getDouble(0); > this.accuracy = array.getInt(2); > > // based on Haversine formula > // (http://www.movable-type.co.uk/scripts/latlong.html) > Double dLat = Math.toRadians(userLocation.getLatitude() > - this.latitude); > Double dLon = Math.toRadians(userLocation.getLongitude() > - this.longitude); > Double a = Math.sin(dLat / 2) * Math.sin(dLat / 2) > + Math.cos(Math.toRadians(this.latitude)) > * > Math.cos(Math.toRadians(userLocation.getLatitude())) > * Math.sin(dLon / 2) * Math.sin(dLon / 2); > Double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); > this.distanceFromUser = earthRadius * c; > } > > public Placemark(Parcel in) { > readFromParcel(in); > } > > �...@override > public String toString() { > return this.address > + (this.distanceFromUser != null ? " (" > + > Math.rint(this.distanceFromUser) + " km)" : ""); > } > > public int describeContents() { > // TODO Auto-generated method stub > return 0; > } > > public void writeToParcel(Parcel dest, int flags) { > dest.writeDouble(latitude); > dest.writeDouble(longitude); > dest.writeInt(accuracy); > dest.writeString(address); > } > > public void readFromParcel(Parcel in) { > latitude = in.readDouble(); > longitude = in.readDouble(); > accuracy = in.readInt(); > address = in.readString(); > } > } > > ------------------------------------------------------------------------------ > and here's the code that throws the error: > > Bundle lastSearchBundle = extras.getBundle("lastSearch"); > mSearchResult= (Placemark[]) lastSearchBundle.getParcelableArray > ("searchResult"); //-->this is the line that throws the error > > ------------------------------------------------------------------------------ > and here's the error detail: > > E/AndroidRuntime( 9449): java.lang.RuntimeException: Unable to start > activity ComponentInfo{com.xxx/com.xxx.Search}: > java.lang.ClassCastException: [Landroid.os.Parcelable; > E/AndroidRuntime( 9449): at > android.app.ActivityThread.performLaunchActivity(ActivityThread.java: > 2268) > E/AndroidRuntime( 9449): at > android.app.ActivityThread.handleLaunchActivity(ActivityThread.java: > 2284) > E/AndroidRuntime( 9449): at android.app.ActivityThread.access$1800 > (ActivityThread.java:112) > E/AndroidRuntime( 9449): at android.app.ActivityThread$H.handleMessage > (ActivityThread.java:1692) > E/AndroidRuntime( 9449): at android.os.Handler.dispatchMessage > (Handler.java:99) > E/AndroidRuntime( 9449): at android.os.Looper.loop(Looper.java:123) > E/AndroidRuntime( 9449): at android.app.ActivityThread.main > (ActivityThread.java:3948) > E/AndroidRuntime( 9449): at java.lang.reflect.Method.invokeNative > (Native Method) > E/AndroidRuntime( 9449): at java.lang.reflect.Method.invoke > (Method.java:521) > E/AndroidRuntime( 9449): at com.android.internal.os.ZygoteInit > $MethodAndArgsCaller.run(ZygoteInit.java:782) > E/AndroidRuntime( 9449): at com.android.internal.os.ZygoteInit.main > (ZygoteInit.java:540) > E/AndroidRuntime( 9449): at dalvik.system.NativeStart.main(Native > Method) > E/AndroidRuntime( 9449): Caused by: java.lang.ClassCastException: > [Landroid.os.Parcelable; > E/AndroidRuntime( 9449): at com.xxx.Search.onCreate(Search.java:96) > E/AndroidRuntime( 9449): at > android.app.Instrumentation.callActivityOnCreate(Instrumentation.java: > 1127) > E/AndroidRuntime( 9449): at > android.app.ActivityThread.performLaunchActivity(ActivityThread.java: > 2231) > E/AndroidRuntime( 9449): ... 11 more > > --------------------------------------------------------------------- > Can somebody point my mistake? Thank you. > > > -- Romain Guy Android framework engineer romain...@android.com Note: please don't send private questions to me, as I don't have time to provide private support. All such questions should be posted on public forums, where I and others can see and answer them --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Android Developers" group. To post to this group, send email to android-developers@googlegroups.com To unsubscribe from this group, send email to android-developers-unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/android-developers?hl=en -~----------~----~----~----~------~----~------~--~---