还有一个 "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 语句的原因。

好的,事实证明我们的客户只是在相当长的一段时间内没有升级产品,这意味着他们 运行 使用的是旧版本的比较器,这确实违反了一般合同。

看来比较器还是很结实的