【问题标题】:Correct way to compare two objects extending Comparable比较扩展 Comparable 的两个对象的正确方法
【发布时间】:2020-06-02 08:15:37
【问题描述】:

我是泛型新手,不知道如何正确比较两个 Comparable 对象。

private int getSortPos(int dir, Comparable d1, Comparable d2) {
    if (d1 == null && d2 != null)
    {
        return dir * -1;
    }
    else if (d1 != null && d2 == null)
    {
        return dir;
    }
    else if (d1 == null)
    {
        return 0;
    }
    else
    {
        return dir * d1.compareTo(d2);
    }
}

我正在使用此代码来比较 String 和 Date 对象,它们都扩展了 Comparable。我在 IntelliJ 中使用声纳,它告诉我:“为此泛型提供参数化类型”,指的是函数参数。该代码按预期工作,但具有“主要代码气味”。这样做的正确方法是什么?

【问题讨论】:

  • 你很可能想要private <T> int getSortPos(int dir, Comparable<T> d1, Comparable<T> d2) { ... }
  • 顺便说一下,compareTo 并不总是返回 -1、0 或 1。它可以返回任意正数/负数。

标签: java generics parameters compare


【解决方案1】:
private <T extends Comparable<T>> int getSortPos(int dir, T d1, T d2) {
    if (d1 == null && d2 != null)
    {
        return dir * -1;
    }
    else if (d1 != null && d2 == null)
    {
        return dir;
    }
    else if (d1 == null)
    {
        return 0;
    }
    else
    {
        return dir * d1.compareTo(d2);
    }
}

这样做解决了我的问题。有没有更好的解决方案?

【讨论】:

  • 根据您的逻辑,当d2null 时,您会实施特殊处理,并且该处理可能与给定类型TcompareTo() 实现不同。这可能是正确/理想的,但至少值得评论。
【解决方案2】:

使您的对象扩展 Comparable&lt;? super T&gt; 。检查集合 API 的 sort(List&lt;T&gt;)max(Collection&lt;? extends T&gt; coll) 声明 https://hg.openjdk.java.net/jdk8/jdk8/jdk/file/687fd7c7986d/src/share/classes/java/util/Collections.java

private <T extends Comparable<? super T>> int getSortPos(int dir, T d1, T d2){}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多