Java"包含"无法正常工作

HPr*_*ash 2 java android overriding contains gson

我的课:

public class UserProgressModel {

    private String email;

    public UserProgressModel(String pEmail) {
        super();

        this.email = pEmail;
    }

    @Override
    public boolean equals(Object x) {

        if (x != null && x instanceof UserProgressModel
                && ((UserProgressModel) x).email.equals(this.email) == true) {

            return true;
        }

        if (x != null && x instanceof String
                && x.equals(this.email) == true) {

            return true;
        }

        return false;
    }

    @Override
    public int hashCode() {
        int hash = 7;
        hash = 17 * hash + (this.email != null ? this.email.hashCode() : 0);
        return hash;
    }
}
Run Code Online (Sandbox Code Playgroud)

在通过gson放置一些对象之后:

UserProgressModel[] userProgressArray;
List<UserProgressModel> retUserProgress = new ArrayList<>();

userProgressArray = gs.fromJson(fileContents,
                        new TypeToken<UserProgressModel[]>() {
                        }.getType());

for (UserProgressModel ele : userProgressArray) {

    if (ele != null) {
        retUserProgress.add(ele);
    }
}
Run Code Online (Sandbox Code Playgroud)

我无法获得以下代码:

retUserProgress.contains("test@test.com");
Run Code Online (Sandbox Code Playgroud)

我通过数组循环以验证一个对象是否有电子邮件.

我做对了吗?我想我已经覆盖了equals和hashcode.

小智 5

你的equals实现是不正确的.如果你看看equals的合同,那么实现必须是对称的:

... for any non-null reference values x and y, x.equals(y) should return true if and only if y.equals(x) returns true. 
Run Code Online (Sandbox Code Playgroud)

在您的情况下,您有一个UserProgressModel对象列表,但您正在尝试与String进行比较.虽然您已经实现了UserProgressModel.equals(String),但仍需要让String.equals(UserProgressModel)返回正确的结果.由于您无法做到这一点,因此在所有情况下都无法使用此实现.你应该做的是两件事:

删除对等于String的检查,因为它永远不会工作.

使用模拟对象签入集合:

retUserProgress.contains(new UserProgressModel("test@test.com"));
Run Code Online (Sandbox Code Playgroud)

只要您的equals方法在您自己的类型(UserProgressModel.equals(UserProgressModel))中是正确的,这应该可以解决您的问题.