【问题标题】:Java: unchecked call to compareTo(T)Java:对 compareTo(T) 的未经检查的调用
【发布时间】:2011-08-03 20:39:14
【问题描述】:
 1  class test {
 2      public static int compare0(Comparable x, Comparable y) {
 3          return x.compareTo(y);
 4      }

 5      public static int compare1(Object x, Object y) {
 6          return ((Comparable) x).compareTo((Comparable) y);
 7      }

 8      public static int compare2(Object x, Object y) {
 9          Comparable p = (Comparable) x;
10          Comparable q = (Comparable) y;
11          return (p).compareTo(q);
12      }

13      public static void main(String[] args) {
14          Comparable zero = new Integer(0);
15          Comparable one = new Integer(1);
16          int c = (zero).compareTo(one);
17      }
18  }

编译上面的代码会产生 4 个警告:

% javac -Xlint:unchecked test.java
test.java:3: warning: [unchecked] unchecked call to compareTo(T) as a member of the raw type java.lang.Comparable
    return x.compareTo(y);
                      ^
test.java:7: warning: [unchecked] unchecked call to compareTo(T) as a member of the raw type java.lang.Comparable
    return ((Comparable) x).compareTo((Comparable) y);
                                     ^
test.java:13: warning: [unchecked] unchecked call to compareTo(T) as a member of the raw type java.lang.Comparable
    return (p).compareTo(q);
                        ^
test.java:19: warning: [unchecked] unchecked call to compareTo(T) as a member of the raw type java.lang.Comparable
    int c = (zero).compareTo(one);
                            ^
4 warnings

我尝试了更多变体,但警告仍然存在。上面 test.compare 方法的正确编写和调用方法是什么?

谢谢!

PS:test.compare 只是一个例子;我不需要这样的功能;但我需要实现一个函数,比如 test.compare,需要在其签名中包含 Comparable 实现对象。

PS2:我已经编程了 25 年以上,我什至在大约 10 年前编写了一段时间的 Java,但是现在使用 Java(我的工作需要)让我发疯。对于有经验的程序员来说,学习 Java 比看起来要难得多。有这么多\ ch 那里学习 Java 的东西,其中 99% 充其量是过时的,或者被用来对编程新手进行排名(即非常冗长),最坏的情况是彻头彻尾的垃圾……我还没有找到关于 Java 的参考资料,可以让我在上面问题的答案中很快归零。

【问题讨论】:

  • “我还没有找到一个关于 Java 的参考资料,可以让我在上面的问题的答案中快速归零。” 这可能是因为它是一个非常广泛的主题,你好像还没有开始研究。这是一个参考:The Java Tutorials > Learning the Java Language > Generics - Introduction
  • @Mark Peters:事实证明,我已经阅读了您链接的参考资料,甚至在我编写上面的代码之前,我发现它有缺陷,原因与我描述的差不多:冗长,针对编程(不仅仅是Java)新手,完全基于琐碎的示例,这些示例并未开始涵盖专业程序员每天必须处理的情况类型等。它当然没有告诉我如何解决问题在这篇文章中描述。我确信这类材料有一定的选区,但这对我没有帮助。

标签: java generics interface comparable unchecked


【解决方案1】:

您应该使用泛型参数声明 compare 方法。

public class ThisTest
{
    public static <T extends Comparable<T>> int compare(T x, T y) {
        if (x == null) 
            return -(y.compareTo(x));
        return x.compareTo(y);
    }

    public static void main()
    {
        // Type inferred
        int c = compare(Integer.valueOf(0), Integer.valueOf(1));
        // Explicit generic type parameter
        c = ThisTest.<Integer>compare(Integer.valueOf(0), Integer.valueOf(1));
    }
}

【讨论】:

  • 是的,有一个语法错误,但你在正确的轨道上。如果您想为compare 方法使用显式类型参数,您需要像ClassName.&lt;Integer&gt;compare(...) 一样调用它。但是,显式参数在这里没有用,因为类型参数将根据参数正确推断。
  • @Mark:谢谢。最近才在做C#,对Java有点生疏了。
  • 这是处理null的好方法。
  • @ratchet 怪胎:我认为抛出NullPointerException 是一种“处理”这种情况的合理方式。许多compareTo() 实现不接受null 作为参数,引发类似的异常。即使他们确实接受了null,将nullnull 的比较视为未定义仍然是合理的。
  • 为了获得最佳效果,您应该使用&lt;T extends Comparable&lt;? super T&gt;&gt;
【解决方案2】:

Comparable 是通用的 - 您应该使用 Comparable&lt;Integer&gt; 定义变量

【讨论】:

  • 我不知道你所说的“定义它”是什么意思。定义什么?
  • 变量...Comparable&lt;Integer&gt; zero = new Integer(0); (旁注:首选Integer.valueOf(..)
【解决方案3】:

真正的问题是您试图在静态方法中进行比较。使进行比较的方法是非静态的,实例化一个或多个“测试器”对象并为每个对象提交一个类型。例如:

 test<String> strTester = new test<String>();

然后调用String对象的比较方法:

 int retCode = strTester.comp(a, b)

如果您想比较其他类型的对象,例如整数,您将需要一个新的测试器对象,例如:

 test<Integer> intTester = new test<Integer>();

如果您愿意这样做,那么您的类可以按照以下方式定义:

 class test<T extends Comparable<T>> {
      public int comp(T x, T y) {
           ...
      }
 }

【讨论】:

    【解决方案4】:

    zeroone 声明为IntegerComparable&lt;Integer&gt; 而不是原始类型。

    Angelika Langer 制作了a great reference for generics. 它以分层常见问题解答的形式进行组织,应该可以让您快速找到大多数通用类型问题的具体答案。在这种情况下,您可能会发现 section on raw types 很有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-11
      相关资源
      最近更新 更多