gpt4 book ai didi

java - 如何子类化 AutoValue 类?

转载 作者:搜寻专家 更新时间:2023-10-30 21:35:12 24 4
gpt4 key购买 nike

我正在使用 AutoValue 扩展来生成我的 Parcelable Android 类。该文档特别指出一个 @AutoValue 不能扩展另一个: https://github.com/google/auto/blob/master/value/userguide/howto.md#inherit

另一位开发人员正在帮助我解决这个问题,并建议“如果您有公共(public)字段,则可以将它们放在两个实现都实现的接口(interface)中。”我假设这意味着图书馆更喜欢组合而不是继承。

我承认,我有点迷路了。如果有人可以提供一个简单的具体示例,说明“子类化”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 扩展,但它是相同的行为。

最佳答案

documentation of AutoValue说:«这种能力是故意不支持的,因为没有办法正确地做到这一点。请参阅 Effective Java,第 2 版第 8 项:“在重写等于时遵守一般约定”。»好书,学到了很多。在第 3 版中,它是第 10 项。简而言之:假设您通过 BetterUser 扩展了您的 User 类。 BetterUser betterUser.equals(User user) 在某些情况下可能为真,但在那些情况下 user.equals(betterUser) 未定义。违反了对称性。这只是问题之一;你尝试的越多,情况就越糟。顺便说一句,这不是特定于 AutoValue 类,而是一个普遍的继承问题。

唯一一致的解决方案是创建一个新类 BetterUser,它不扩展 User 但有一个类型为 User 的字段。这样,您可以根据需要定义 BetterUser 的行为,而不会对其他类产生任何影响。或者,如果 User 只有几个字段,只需复制并粘贴代码即可。

关于java - 如何子类化 AutoValue 类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39798001/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com