Comparator<? super E> comparator()
此方法在 Sorted Set 接口中声明。
超级是什么意思?
上述方法与通用方法和带有通配符参数的方法有何不同。
Comparator<? super E> comparator()
此方法在 Sorted Set 接口中声明。
超级是什么意思?
上述方法与通用方法和带有通配符参数的方法有何不同。
这意味着比较的类型可以是当前类型的超类型。
例如。您可以拥有以下内容:
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
。
希望这有用。
ASortedSet
需要有一些规则来确定排序。Comparator
就是这些规则的执行。该接口提供了一种获取对它的引用的方法,以便您可以将其用于其他目的,例如创建另一个使用相同排序规则的集合。
答案在接口声明中: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());
}
});
这里的“超级”意味着该方法不需要为 E 返回一个比较器。它可能会为 E 的任何超类返回一个比较器。所以,为了具体化,如果 E 是字符串,这个方法可以给你一个更通用的对象的比较器。
泛型方法将声明它自己的新泛型参数。此方法仅引用由类声明声明的泛型参数SortedSet<E>
E。通用方法不太常见。它们通常是静态的,例如 Arrays 方法
public static <T> List<T> asList(T...)
在这里,T 仅在此方法中声明和使用。它表明返回列表中的对象类型与 vararg 参数中的对象类型相同。
我不确定通配符参数的确切定义。? 是通配符。当您获得通配符参数时的一般模式List<?>
是您可以从中取出对象并将它们转换为 Object 但您不能放入任何东西。