我写了一些代码,这里是相关片段:
@NonNullByDefault
public class Score<NUMERAL, LITERAL>
{
protected NUMERAL value;
@Nullable
protected LITERAL literal;
[...]
我已经重写了equals()
方法,如下所示:
@Override
public boolean equals(@Nullable Object object)
{
if(object == null) return false;
if(object == this) return true;
if( object instanceof Score)
{
return ((Score<NUMERAL, LITERAL>) object).getValue().equals(value) &&
literal == null ? ((Score<NUMERAL, LITERAL>) object).getLiteral() == null : literal.equals(((Score<NUMERAL, LITERAL>) object).getLiteral());
}
return false;
}
基本上,这个想法是一个分数(Score)只能有一个数字值,此时字面量(literal)为空。我已经编写了一些单元测试,并在下面的代码中遇到了空指针异常:
[....]
Score<Float, String> score = new Score<>(0.0f);
Score<Float, String> anotherScore = new Score<>(1.0f, "One");
[....]
assertFalse(score.equals(anotherScore));
如果我没有理解错的话,在
equals
中使用短路操作符不应该会阻止后面的任何表达式被执行,因为第一个表达式已经是false
了吗?此外,为什么会有异常?由于条件为真,我希望三元表达式的表达式被评估,而条件表达式被跳过。根据我在规范中读到的内容,这应该是行为。此外,我在这里发现了一个问题:Java ternary (immediate if) evaluation 这应该对我的思维过程有所帮助。
也许我忽略了一些非常明显的东西,但我已经没有想法了。也许你可以帮忙解决?