【问题标题】:Yet Another "Comparison method violates its general contract"又一个“比较法违背其总约”
【发布时间】:2019-02-21 20:49:22
【问题描述】:

我已阅读与此相关的所有其他答案,在我看来代码应该可以工作,唉,事实并非如此。

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 语句。

【问题讨论】:

  • 您的if 看起来对传递性很怀疑。考虑两个spA 和一个不是。
  • 你能说明你是如何使用这个的吗?
  • @mehdimaick 这是使用 Collections.sort(specials, new SpecialComparator()); 调用的
  • @chrylis 我已经添加了一个具有这种确切场景的测试,但是如果 A-B>0 和 B-C>0 然后 A-C>0 ...我无法创建导致它失败的测试。任何想法如何与您的建议?
  • @StuartMarks 没错,在这种特殊情况下,我们优先考虑 TypeA 对象。

标签: java comparator


【解决方案1】:

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

看起来比较器毕竟是可靠的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-04
    • 1970-01-01
    相关资源
    最近更新 更多