比较静态类中使用的参数

时间:2012-09-06 12:11:52

标签: java class static comparator

有一些我从Sedgewick的算法书中无法理解的代码,特别是有关比较器的部分。我非常清楚其他一切是如何工作的,例如,提供的算法,使用Comparators和Comparable的意图等等。但是,我似乎没有得到的一件事是比较的参数(Transaction v,Transaction w) )静态类中的方法。例如,对象数组由sort中的另一个Object引用传递和持有。当调用helper方法less()时,Object数组的两个元素由另一个Object引用保存。但这是我没有得到的:

    public static class WhoOrder implements Comparator<Transaction> {
    public int compare(Transaction v, Transaction w) {
        return v.who.compareTo(w.who);
    }
}

Object引用似乎已被Transaction引用取代。这是怎么回事?有了多态性,你必须使用一个明确的向下转换,但这似乎绕过了它。我的猜测是因为参数化类型,但我不知道为什么会这样。

包含实现Comparator

的静态类的类
public class Transaction {
private final String  who;      // customer
private final Date    when;     // date
private final double  amount;   // amount

...


// ascending order of account number
public static class WhoOrder implements Comparator<Transaction> {
    public int compare(Transaction v, Transaction w) {
        return v.who.compareTo(w.who);
    }
}

public static void main(String[] args) {
    ...
    Arrays.sort(a, new Transaction.WhoOrder());
}

排序类:

// use a custom order and Comparator interface - see Section 3.5
public static void sort(Object[] a, Comparator c) {
    int N = a.length;
    for (int i = 0; i < N; i++) {
        for (int j = i; j > 0 && less(c, a[j], a[j-1]); j--) {
            exch(a, j, j-1);
        }
    }
}

// is v < w ?
private static boolean less(Comparator c, Object v, Object w) {
    return (c.compare(v, w) < 0);
}

// exchange a[i] and a[j]
private static void exch(Object[] a, int i, int j) {
    Object swap = a[i];
    a[i] = a[j];
    a[j] = swap;
}

1 个答案:

答案 0 :(得分:2)

WhoOrderComparator实施,Transaction作为其类型参数,因此compare的实施接受两个Transactions。但是,less方法采用原始Comparator(没有类型)。为了向后兼容,执行此操作时会禁用泛型类型检查,因此您可以将Objects传递给compare