还有一个 "Comparison method violates its general contract"
Yet Another "Comparison method violates its general contract"
我已经阅读了与此相关的所有其他答案,在我看来代码应该可以工作,唉,事实并非如此。
protected static class SpecialComparator implements Comparator<SpecialDTO>
{
@Override
public int compare( SpecialDTO sp1, SpecialDTO sp2 )
{
if( !sp1.isTypeA() || !sp2.isTypeA() )
return sp1.isTypeA().compareTo( sp2.isTypeA() );
SpecialNestedADTO spn1 = sp1.getNestedA();
SpecialNestedADTO spn2 = sp2.getNestedA();
return Comparator
.comparing( SpecialNestedADTO::getId )
.thenComparing( SpecialNestedADTO::getReps )
.compare( spn1, spn2 );
}
}
知道为什么这会抛出 IllegalArgumentException 吗?
值得一提的是,如果他们的 SpecialDTO 不是 TypeA,那么我们就不能 getNestedA() 所以应该跳过比较器的其余部分。这就是为什么我们在开头有 if 语句的原因。
好的,事实证明我们的客户只是在相当长的一段时间内没有升级产品,这意味着他们 运行 使用的是旧版本的比较器,这确实违反了一般合同。
看来比较器还是很结实的
我已经阅读了与此相关的所有其他答案,在我看来代码应该可以工作,唉,事实并非如此。
protected static class SpecialComparator implements Comparator<SpecialDTO>
{
@Override
public int compare( SpecialDTO sp1, SpecialDTO sp2 )
{
if( !sp1.isTypeA() || !sp2.isTypeA() )
return sp1.isTypeA().compareTo( sp2.isTypeA() );
SpecialNestedADTO spn1 = sp1.getNestedA();
SpecialNestedADTO spn2 = sp2.getNestedA();
return Comparator
.comparing( SpecialNestedADTO::getId )
.thenComparing( SpecialNestedADTO::getReps )
.compare( spn1, spn2 );
}
}
知道为什么这会抛出 IllegalArgumentException 吗?
值得一提的是,如果他们的 SpecialDTO 不是 TypeA,那么我们就不能 getNestedA() 所以应该跳过比较器的其余部分。这就是为什么我们在开头有 if 语句的原因。
好的,事实证明我们的客户只是在相当长的一段时间内没有升级产品,这意味着他们 运行 使用的是旧版本的比较器,这确实违反了一般合同。
看来比较器还是很结实的