我正在使用AutoValue扩展来生成我的Parcelable Android类。该文档明确指出一个@AutoValue不能扩展另一个: https://github.com/google/auto/blob/master/value/userguide/howto.md#inherit
另一位开发人员正在帮我解决这个问题,并建议“如果你有共同的字段,你可以将它们放在两个实现都实现的接口中。”我假设这意味着图书馆更喜欢构图而不是继承。
我承认,我有点迷茫。如果有人可以提供一个简单的“子类化”AutoValue类的简单方法的例子,那将是值得赞赏的。这是一个简单的课程:
@AutoParcelGson
public abstract class User implements Parcelable {
public abstract String username();
public static User create(String username) {
return builder().username(username).build();
}
public static Builder builder() {
return new AutoParcelGson_User.Builder();
}
@AutoParcelGson.Builder
public interface Builder {
Builder username(String username);
User build();
}
}
我想要另一个名为Customer的@AutoValue类,它有一些额外的字段。此外,@ AutoParcelGson是我正在使用的@AutoValue扩展,但它是相同的行为。
答案 0 :(得分:0)
documentation of AutoValue说:«故意不支持此能力,因为没有正确的方法。参见《有效Java,第二版》第8项:“在重载等于时遵守总契约。”»一本好书,我学到了很多东西。在第三版中,该项目为10。简而言之:假设您将User
类扩展了BetterUser
。在某些情况下BetterUser betterUser.equals(User user)
可能是正确的,但在这些情况下user.equals(betterUser)
未定义。违反对称性。那只是问题之一;您尝试的次数越多,情况就越糟。顺便说一句,这不是特定于AutoValue类,而是一个普遍的继承问题。
唯一一致的解决方案是制作一个新类BetterUser
,该类不扩展User
但具有类型User
的字段。这样,您可以根据需要定义BetterUser
的行为,而不会影响其他类。或者,如果User
只有几个字段,则只需复制并粘贴代码。
答案 1 :(得分:0)
这是一个工作代码示例。就我而言,该测试将打印ModelMapper
。
{"newString":"foobar","myInt":1,"myString":"asdf"}