是否可以将以下代码转换为使用泛型?

2022-09-02 21:05:06

我正在转换一个应用程序以使用Java 1.5,并找到了以下方法:

  /**
   * Compare two Comparables, treat nulls as -infinity.
   * @param o1
   * @param o2
   * @return -1 if o1<o2, 0 if o1==o2, 1 if o1>o2
   */
  protected static int nullCompare(Comparable o1, Comparable o2) {
    if (o1 == null) {
      if (o2 == null) {
        return 0;
      } else {
        return -1;
      }
    } else if (o2 == null) {
      return 1;
    } else {
      return o1.compareTo(o2);
    }
  }

理想情况下,我想使该方法采用两个相同类型的可比,是否可以转换它以及如何转换?

我认为以下内容可以解决问题:

protected static <T extends Comparable> int nullCompare(T o1, T o2) {

但它未能摆脱IntelliJ中的警告“对'compareTo(T)'作为原始类型'java.lang.Comparable'成员的未检查调用”:

return o1.compareTo(o2);

答案 1

将其更改为:

protected static <T extends Comparable<T>> int nullCompare(T o1, T o2) {

你需要它,因为Compare本身就是一个泛型类型。


答案 2

这是一个奇怪的情况:

static class A {
    ...
}

static class B extends A implements Comparable<A> {
    public int compareTo(A o) {
        return ...;
    }
}

幸运的是,像上面这样的代码很少见,但nullCompare()将不支持Bs的比较,除非声明Compaable可能适用于T或其任何超类

protected static <T extends Comparable<? super T>> int nullCompare(T o1, T o2) {

尽管大多数人永远不会从上述调整中受益,但在为导出的库设计API时,它可能会派上用场。


推荐