【发布时间】:2019-02-24 06:55:17
【问题描述】:
为了避免我的equals() 中出现空指针异常,我必须考虑一个或多个空值的可能性。
是否有一种可扩展的方式来考虑空值?如果我添加更多类型参数,以下代码将很快变得丑陋。
public boolean equals(Pair<T, U> p) {
boolean firstIsEqual, secondIsEqual;
if (p.getFirst()==null) {
firstIsEqual = first == null;
}
else {
firstIsEqual = (first!=null) && (first.equals(p.getFirst()));
}
// copy-paste...
if (p.getSecond()==null) {
secondIsEqual = second == null;
}
else {
secondIsEqual = (second!=null) && (second.equals(p.getSecond()));
}
return (firstIsEqual && secondIsEqual);
}
【问题讨论】:
-
这不是标准用途的有效
equals;使用@Override将有助于防止此问题。假设Pair是你自己的类,那么(在适当的类型检查之后你必须添加)我就写return Objects.equals(this.first, p.first) && Objects.equals(this.second, p.second);。 -
@chrylis 如果我覆盖,我将不得不将
Object转换为Pair(“未经检查的转换”警告)。这不是应该避免的吗? -
这不是未经检查的演员表,而是关于泛型的。一般来说是的,你应该避免它,但在
equals(Object)这是不可避免的。如果你不覆盖(并覆盖hashCode),你肯定不会得到你期望的行为。
标签: java generics nullpointerexception null equals