【发布时间】:2016-10-03 12:45:00
【问题描述】:
我的班级:
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;
}
}
在通过 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);
}
}
我无法验证以下代码:
retUserProgress.contains("test@test.com");
我遍历数组以验证一个对象是否有电子邮件。
我做得对吗?我想我已经覆盖了等号和哈希码。
【问题讨论】:
-
让您的
UserProgressModel.equals(...)告诉您该对象等于String不符合equals方法的一般约定。UserProgressModel并不是真正“等于”字符串。此外,myString.equals(myUserProgressModel)将始终返回 false,因此您正在创建一个不对称的平等。此外,您的字符串和模型实例将具有不同的哈希码,因此它们不应假装相等。 -
retUserProgress 是一个 List... 不是直接 UserProgressModel ,所以也许这就是问题。
标签: java android gson overriding contains