0
Comparator<? super E> comparator()

此方法在 Sorted Set 接口中声明。

超级是什么意思?

上述方法与通用方法和带有通配符参数的方法有何不同。

4

5 回答 5

3

这意味着比较的类型可以是当前类型的超类型。

例如。您可以拥有以下内容:

static class A {
}

static class B extends A {
}

public static void main(String[] args) {

    Comparator<A> comparator = new Comparator<A>() {
        public int compare(A a1, A b2) {
            return 0;
        }
    };

    // TreeSet.TreeSet<B>(Comparator<? super B> c)
    SortedSet<B> set = new TreeSet<B>(comparator);

    // Comparator<? super B> comparator()
    set.comparator();
}

在这种情况下,A是 的超类型B

希望这有用。

于 2012-05-30T21:43:42.587 回答
3

ASortedSet需要有一些规则来确定排序。Comparator就是这些规则的执行。该接口提供了一种获取对它的引用的方法,以便您可以将其用于其他目的,例如创建另一个使用相同排序规则的集合。

于 2012-05-30T21:21:40.930 回答
0

javadoc

“返回用于对该集合中的元素进行排序的比较器,如果该集合使用其元素的自然排序,则返回 null。”

:)

于 2012-05-30T21:22:12.867 回答
0

答案在接口声明中:public interface SortedSet<E> extends Set<E> { ...

这意味着任何implements SortedSet应该指定它们将使用哪种类型的类。例如

class MyClass implements SortedSet<AnotherClass>

这将产生(使用eclipse),一堆方法,如

    public Comparator<? super AnotherClass> comparator()
{
    return null;
}

public boolean add( AnotherClass ac)
{
    return false;
}

AnotherClass正如 Paul Vargas 指出的那样,这当然适用于所有子类。

您可能缺少的另一个方面是 Comparator 也是一个接口:public interface Comparator<T>. 所以你返回的是这个的实现。

出于兴趣,使用 Comparator 接口的另一种有用方法是将其匿名指定为Arrays.sort(Object[] a, Comparator c)方法的一部分:

如果我们有一个 Person 类,我们可以使用此方法对年龄和姓名进行排序,如下所示:

    Person[] people = ....;
// Sort by Age
    Arrays.sort(people, new Comparator<Person>()
    {
        public int compare( Person p1, Person p2 )
        {
            return p1.getAge().compareTo(p2.getAge());
        }
    });


// Sort by Name
    Arrays.sort(people, new Comparator<Person>()
    {
        public int compare( Person p1, Person p2 )
        {
            return p1.getName().compareTo(p2.getName());
        }
    });
于 2012-05-30T22:14:16.030 回答
0

这里的“超级”意味着该方法不需要为 E 返回一个比较器。它可能会为 E 的任何超类返回一个比较器。所以,为了具体化,如果 E 是字符串,这个方法可以给你一个更通用的对象的比较器。

泛型方法将声明它自己的新泛型参数。此方法仅引用由类声明声明的泛型参数SortedSet<E>E。通用方法不太常见。它们通常是静态的,例如 Arrays 方法

public static <T> List<T> asList(T...)

在这里,T 仅在此方法中声明和使用。它表明返回列表中的对象类型与 vararg 参数中的对象类型相同。

我不确定通配符参数的确切定义。? 是通配符。当您获得通配符参数时的一般模式List<?>是您可以从中取出对象并将它们转换为 Object 但您不能放入任何东西。

于 2012-05-30T22:22:19.483 回答