为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

精慕HU 2021-06-15 17:42:49
我有一个服装类,它有一个抽象类作为其属性之一。当我侦听数据库中的更改时,出现此错误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 等。服装.javapublic 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;}
查看完整描述

1 回答

?
慕村9548890

TA贡献1884条经验 获得超4个赞

您的具体Outfit类具有定义的字段和属性Item:


public class Outfit implements Parcelable{

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


    ...    

    public List<Item> getItemList() 

这意味着 Firebase SDK 将尝试实例化Item,这是不可能的,因为它是抽象的。您很可能希望 Firebase 在Item读取数据时实例化正确的(具体)子类型,但它无法知道这是什么子类型。


您要么必须标记Item为非抽象,要么必须将 标记itemList为具有特定的具体子类型Item.


查看完整回答
反对 回复 2021-06-23
  • 1 回答
  • 0 关注
  • 156 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信