繁体   English   中英

我可以将以下代码转换为使用泛型吗?

[英]Can I convert the following code to use generics?

我正在转换应用程序以使用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);

将其更改为:

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

你需要它,因为Comparable本身就是一种通用类型。

这是一个奇怪的案例:

static class A {
    ...
}

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

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

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

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

无法编辑所以我必须发布我的答案。

您需要声明嵌套类型参数,因为Comparable是通用的。

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

请注意, 可比较<? 超级T> ,这使得更灵活。 您将在Collections.sort上看到相同的方法定义

public static <T extends Comparable<? super T>> void sort(List<T> list) {

我不确定这种方法的泛化是否有意义。 目前该方法适用于任何类型的可比较; 如果你将它泛化,你将不得不多次实现它(使用完全相同的代码)。 有时可以比较两个没有共同祖先的对象,任何通用版本都不允许这样做。

通过添加泛型,您不会为代码添加任何安全性; 在对compareTo的调用中会发生任何安全问题。 我建议的只是压制警告。 它并没有真正警告你任何有用的东西。

为了使它更加通用,你甚至可以让它适用于两种不同的类型。 = P

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM