猿问

android firebase 在侦听器中调用 getValue() 时无法实例化抽象类

我有一个服装类,它有一个抽象类作为其属性之一。当我侦听数据库中的更改时,出现此错误java.lang.RuntimeException: java.lang.InstantiationException: Can't instantiate abstract class com.example.recouture.Item


 DatabaseReference reference = FirebaseDatabase.getInstance().getReference();

    Query query = reference.child(FirebaseAuth.getInstance().getCurrentUser().getUid()).child("Outfits");

    query.addListenerForSingleValueEvent(new ValueEventListener() {

        @Override

        public void onDataChange(DataSnapshot dataSnapshot) {

            for (DataSnapshot singleSnapshot : dataSnapshot.getChildren()) {

                outfits.add(singleSnapshot.getValue(Outfit.class)); //error is here

            }

是否有可能规避这一点,因为使 Item 非抽象会导致我的其他代码部分出现设计问题。Item 是抽象的,因为它可以包含从 Item 类扩展的 Shirt、Pants 等。


服装.java


public class Outfit implements Parcelable{


private List<Item> itemList = new ArrayList<>();

private String mName;

private String mImageUrl;



public Outfit() {}



public Outfit(String mName, String mImageUrl,List<Item> items) {

    this.mName = mName;

    this.mImageUrl = mImageUrl;

    this.itemList = items;

}


public List<Item> getItemList() {

    return itemList;

}


protected Outfit(Parcel in) {

    in.readList(itemList,Item.class.getClassLoader());

    mName = in.readString();

    mImageUrl = in.readString();

}


public static final Creator<Outfit> CREATOR = new Creator<Outfit>() {

    @Override

    public Outfit createFromParcel(Parcel in) {

        return new Outfit(in);

    }


    @Override

    public Outfit[] newArray(int size) {

        return new Outfit[size];

    }

};


public String getmName() {

    return mName;

}


public String getmImageUrl() {

    return mImageUrl;

}


精慕HU
浏览 173回答 1
1回答

慕村9548890

您的具体Outfit类具有定义的字段和属性Item:public class Outfit implements Parcelable{&nbsp; &nbsp; private List<Item> itemList = new ArrayList<>();&nbsp; &nbsp; ...&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; public List<Item> getItemList()&nbsp;这意味着 Firebase SDK 将尝试实例化Item,这是不可能的,因为它是抽象的。您很可能希望 Firebase 在Item读取数据时实例化正确的(具体)子类型,但它无法知道这是什么子类型。您要么必须标记Item为非抽象,要么必须将 标记itemList为具有特定的具体子类型Item.
随时随地看视频慕课网APP

相关分类

Java
我要回答