有人可以解释这个Java代码片段是如何工作的吗?

时间:2014-02-09 08:04:57

标签: java generics collections

以下是片段(来自Java Generics and Collections),下面是问题:

public static <T extends Comparable<? super T>> Comparator<T> reverseOrder()
    {
        return new Comparator<T>() {
        public int compare(T o1, T o2) { return o2.compareTo(o1); }
    };
}

正如我所说的那样,你有一个使用通配符的方法,它可以比较类型T和“上面”。然后它返回一个新的Comparator,它在其中有一个方法,它使用两个类型为T的对象返回compareTo的值。所以问题:

  1. 这是在方法中定义方法吗?我以为你不能这样做 在Java中。
  2. 是否返回方法?我认为你做不到的事情 在爪哇。
  3. 我该如何使用?这本书使用了其他类似的例子, 方法有参数。
  4. 这没有参数,所以o1和o2来自哪里?

3 个答案:

答案 0 :(得分:5)

这是anonymous class

public static <T extends Comparable<? super T>> Comparator<T> reverseOrder() {
    return new Comparator<T>() {
        public int compare(T o1, T o2) {
            return o2.compareTo(o1);
        }
    };
}

你是:

  1. 在匿名类中声明方法compare,该方法位于方法reverseOrder中。
  2. 返回匿名类的实例。
  3. o1o2声明为compare的参数。

答案 1 :(得分:0)

问题/尝试答案:

  

正如我所说的那样,你有一个使用通配符的方法,它可以比较类型T和“上面”。

方法可以不扩展,所以不,这是不正确的。该方法是通用的,可以与扩展Comparable的具体类一起使用。

  

然后返回一个新的Comparator,它在其中有一个方法,它使用两个类型为T的对象返回compareTo的值。所以问题:

好的,有点正确。

  

1)这是在方法中定义一个方法吗?我以为你不能用Java做到这一点。

它不是方法中的方法。这是一个返回Comparator类型的对象的方法,它具有自己的比较方法。

  

2)它返回一个方法吗?我认为你不能用Java做的事情。

不,它返回一个匿名内部类的对象。

  

3)我该如何使用它?本书使用了其他类似方法具有参数的示例。这没有参数,那么o1和o2来自哪里?

o1和o2是Comparator对象比较方法的声明参数。

答案 2 :(得分:0)