brancz
brancz

Reputation: 451

Android Parcelable Cannot instantiate the type

I am working on an Android App, and I am trying to pass information using Parcelable. So here's what I've got.

import android.os.Parcel;
import android.os.Parcelable;

abstract class Role implements Parcelable {

    private String name;
    private String image;

    public Role() {

    }

    public Role(Parcel read) {
        name = read.readString();
        image = read.readString();
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getImage() {
        return image;
    }

    public void setImage(String image) {
        this.image = image;
    }

    public String toString() {
        return this.name;
    }

    public static final Parcelable.Creator<Role> CREATOR = 
            new Parcelable.Creator<Role>() {

                public Role createFromParcel(Parcel source) {
                    return new Role(source);
                }

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

    public int describeContents() {
        // TODO Auto-generated method stub
        return 0;
    }

    public void writeToParcel(Parcel dest, int flags) {
        // TODO Auto-generated method stub
        dest.writeString(name);
        dest.writeString(image);
    }

}

However, when I try to compile I get the Error (where I placed the comment)

Cannot instantiate the Type Role

Any thoughts on this?

Best regards

Upvotes: 1

Views: 2172

Answers (3)

ericn
ericn

Reputation: 13103

As qjuanp mentioned, one cannot instantiate an abstract class (as per Java's and common OOP definition; you cannot instantiate something that is abstract, it has got to be more defined).

I'm sure you're trying to use some subclasses of Role (that's about the only way you can use both abstract and implement Parcelable here), consider using this approach:

public abstract class A implements Parcelable {
    private int a;

    protected A(int a) {
        this.a = a;
    }

    public void writeToParcel(Parcel out, int flags) {
        out.writeInt(a);
    }

    protected A(Parcel in) {
        a = in.readInt();
    }
}

public class B extends A {
    private int b;

    public B(int a, int b) {
        super(a);
        this.b = b;
    }

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

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

    public int describeContents() {
        return 0;
    }

    public void writeToParcel(Parcel out, int flags) {
        super.writeToParcel(out, flags);
        out.writeInt(b);
    }

    private B(Parcel in) {
        super(in);
        b = in.readInt();
    }
}

Upvotes: 1

qjuanp
qjuanp

Reputation: 2816

Yout class Role is defined as abstract, the abstract classes cannot be instantiated.

just define your class Role:

class Role implements Parcelable {
    //...
}

Upvotes: 1

opaque
opaque

Reputation: 394

I have not used parcelable in abstract class myself, but it should be ok. You may want to check here or more generally here

I have a VERY similar class (two strings) but its a public static class. I do new() on my string members in the constructor.

Upvotes: 1

Related Questions