【问题标题】:error: incompatible types: Object cannot be converted to MyClass错误:不兼容的类型:对象无法转换为 MyClass
【发布时间】:2017-11-09 18:57:38
【问题描述】:

我想使用 @Parcel 注释而不是实现 Parcelable。
所以我的课是:

@Parcel
public class UserSkillSpec {
    private final String TAG = getClass().getSimpleName();

    private Skill skill;
    private int endorses = 0;
    private boolean endorsed = false;
    private List<User> endorsers = new LinkedList<>();
    private int proficiency = 0;
    private boolean verified = false;

    @ParcelConstructor
    public UserSkillSpec(Skill skill, int proficiency) {
        this.skill = skill;
        this.proficiency = proficiency;
    }

}    

当我要构建项目时,MessageBox会出现这个错误

Error:(62, 109) error: incompatible types: Object cannot be converted to User    

和用户源代码是:

@Parcel
@RealmClass
public class User extends RealmObject {
    @PrimaryKey
    private String id;

    private String firstName;
    private String lastName;
    private String name;
   //and something else

    public User() {
    }
}    

显然这个问题与 List 有关。
我该如何解决我的问题?
谢谢。

编辑1: 我将用户类更改为以下代码:

@Parcel(implementations = {UserRealmProxy.class},
        value = Parcel.Serialization.BEAN,
        analyze = {User.class})
@RealmClass
public class User implements RealmModel {
    @PrimaryKey
    private String id;

    private String firstName;
    private String lastName;
    private String name;
    //somethings else

    public User() {
    }
}

在 Parceler 库自动生成的类 UserSkillSpec$$Parcelable 中,错误发生在 for 部分:

public static void write(UserSkillSpec userSkillSpec$$1, android.os.Parcel parcel$$1, int flags$$0, IdentityCollection identityMap$$0) {
        int identity$$0 = identityMap$$0 .getKey(userSkillSpec$$1);
        if (identity$$0 != -1) {
            parcel$$1 .writeInt(identity$$0);
        } else {
            parcel$$1 .writeInt(identityMap$$0 .put(userSkillSpec$$1));
            Skill$$Parcelable.write(InjectionUtil.getField(Skill.class, UserSkillSpec.class, userSkillSpec$$1, "skill"), parcel$$1, flags$$0, identityMap$$0);
            parcel$$1 .writeInt(InjectionUtil.getField(int.class, UserSkillSpec.class, userSkillSpec$$1, "proficiency"));
            if (InjectionUtil.getField(List.class, UserSkillSpec.class, userSkillSpec$$1, "endorsers") == null) {
                parcel$$1 .writeInt(-1);
            } else {
                parcel$$1 .writeInt(InjectionUtil.getField(List.class, UserSkillSpec.class, userSkillSpec$$1, "endorsers").size());
                for (User user$$0 : InjectionUtil.getField(List.class, UserSkillSpec.class, userSkillSpec$$1, "endorsers")) {
                    User$$Parcelable.write(user$$0, parcel$$1, flags$$0, identityMap$$0);
                }
            }
            parcel$$1 .writeInt((InjectionUtil.getField(boolean.class, UserSkillSpec.class, userSkillSpec$$1, "verified")? 1 : 0));
            parcel$$1 .writeInt(InjectionUtil.getField(int.class, UserSkillSpec.class, userSkillSpec$$1, "endorses"));
            parcel$$1 .writeString(InjectionUtil.getField(String.class, UserSkillSpec.class, userSkillSpec$$1, "TAG"));
            parcel$$1 .writeInt((InjectionUtil.getField(boolean.class, UserSkillSpec.class, userSkillSpec$$1, "endorsed")? 1 : 0));
        }
    }

【问题讨论】:

  • @Parcel() - 不应该是@Parcel吗?错误也出现在哪一行?
  • RealmObject 可以打包吗?为什么你认为这个问题与 List 有关你有更多关于这个错误的信息吗?
  • @Timo ,我需要将用户声明为 Parcelable。因为我通过intent.putExtra 某处传递它。
  • 是的,但是如果你扩展或者你的父母类也需要是可打包的,你就不能这样做
  • 哪一行出现错误?你能粘贴更多的堆栈跟踪吗?

标签: android parceler


【解决方案1】:

您可能应该为您的用户使用实现而不是扩展,因为您的父类不可打包。

Tips

你应该考虑实现你的自定义创建者like this

【讨论】:

  • 我通过实现替换了extends,但我无法解决错误。
  • 以及您将对象打包并取回的部分
【解决方案2】:

我终于可以解决我的问题,并决定分享它。
提示: 1. 列表必须是 Generic.List&lt;Item&gt; 而不是 List
2.在List&lt;Item&gt;的声明中使用@ParcelPropertyConverter(ItemListParcelConverter.class)

所以我的代码现在如下所示:

@Parcel(implementations = {UserRealmProxy.class},
        value = Parcel.Serialization.BEAN,
        analyze = {User.class})
public class User extends RealmObject {
    @PrimaryKey
    private String id;

    private String firstName;
    private String lastName;
    private String name;}    

还有这个:

@Parcel
public class UserSkillSpec {
    private Skill skill;
    private int endorses = 0;
    private boolean endorsed = false;
    @ParcelPropertyConverter(ItemListParcelConverter.class)
    private List<User> endorsers = new LinkedList<>();
    private int proficiency = 0;
    private boolean verified = false;

    public UserSkillSpec() {
    }
}

这是 parcelConvertor 类:

public class ItemListParcelConverter<T> extends ArrayListParcelConverter<T> {
    @Override
    public void itemToParcel(T item, Parcel parcel) {
        parcel.writeParcelable(Parcels.wrap(item), 0);
    }

    @Override
    public T itemFromParcel(Parcel parcel) {
        return Parcels.unwrap(parcel.readParcelable(getClass().getClassLoader()));
    }
}

【讨论】:

    【解决方案3】:

    如果你想使用 RealmModel 而不是 RealmObject,你可以按照这个来使用 Parceler 库。

    前级:

    @Parcel(implementations = { CustomAreaRealmProxy.class },
            value = Parcel.Serialization.BEAN,
            analyze = { CustomArea.class })
    @RealmClass
    public class CustomArea implements RealmModel {
        ...
    }
    

    对于你的 proguard 文件;

    # Parceler library
    -keep interface org.parceler.Parcel
    -keep @org.parceler.Parcel class * { *; }
    -keep class **$$Parcelable { *; }
    -keepnames public class * extends io.realm.RealmObject
    -keepnames public class * implements io.realm.RealmModel  #<- This is the fix
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-04-27
      • 1970-01-01
      • 2023-03-26
      • 1970-01-01
      • 1970-01-01
      • 2017-10-03
      • 1970-01-01
      相关资源
      最近更新 更多