【问题标题】:Can I convert the following code to use generics?我可以将以下代码转换为使用泛型吗?
【发布时间】:2008-09-12 14:21:39
【问题描述】:

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

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

我认为以下方法可以解决问题:

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

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

return o1.compareTo(o2);

【问题讨论】:

    标签: java generics comparison


    【解决方案1】:

    改成:

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

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

    【讨论】:

    • 啊!我不敢相信我是如此接近
    • 你确定 T extends Comparable 是对的吗?似乎 T extends Comparable> 会更正确?
    • @cletus:T extends Comparable&lt;T&gt; 是正确的。如果 Foo 对象可以在您尝试排序时将自己与 Bar 对象进行比较,这将无济于事。
    【解决方案2】:

    这是一个奇怪的案例:

    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 时它可能会派上用场。

    【讨论】:

      【解决方案3】:

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

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

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

      请注意 可比较,更加灵活。您将在 Collections.sort 上看到相同的方法定义

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

          为了使其更通用,您甚至可以让它适用于两种不同的类型。 =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);
              }
            }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-12-09
            • 2022-08-17
            • 1970-01-01
            • 2010-10-01
            • 2023-03-31
            • 1970-01-01
            相关资源
            最近更新 更多