Comparator<? super E> comparator()
このメソッドは、SortedSetインターフェースで宣言されています。
スーパーとはどういう意味ですか?
上記のメソッドは、ジェネリックメソッドやワイルドカード引数を使用するメソッドとどのように異なりますか。
Comparator<? super E> comparator()
このメソッドは、SortedSetインターフェースで宣言されています。
スーパーとはどういう意味ですか?
上記のメソッドは、ジェネリックメソッドやワイルドカード引数を使用するメソッドとどのように異なりますか。
SortedSet
は、並べ替えを決定するために使用するいくつかのルールを持っている必要があります。これらのComparator
ルールの実装です。インターフェイスは、同じ並べ替えルールを使用する別のセットを作成するなど、他の目的に使用できるように、その参照を取得するためのメソッドを提供します。
これは、比較のタイプが現在のタイプのスーパータイプである可能性があることを意味します。
例えば。あなたは以下を持つことができます:
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
。
これがお役に立てば幸いです。
これに対する答えは、インターフェース宣言にあります。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
当然のことながら、これはPaulVargasが指摘したようにのすべてのサブクラスで機能します。
あなたが見逃しているかもしれない他の側面は、コンパレータがインターフェースでもあるということです: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が文字列の場合、このメソッドはより一般的なものになります。オブジェクトのコンパレータ。
ジェネリックメソッドは、独自の新しいジェネリックパラメーターを宣言します。このメソッドは、クラス宣言によって宣言されたジェネリックパラメーターEを参照するだけSortedSet<E>
です。一般的な方法はあまり一般的ではありません。それらは通常、Arraysメソッドのように静的です
public static <T> List<T> asList(T...)
ここで、Tは宣言され、このメソッドでのみ使用されます。返されるリスト内のオブジェクトのタイプが、varargパラメーター内のオブジェクトのタイプと同じであることを示しています。
ワイルドカード引数の正確な定義はわかりません。?ワイルドカード文字です。のようなワイルドカードパラメータを取得するときの一般的なパターンList<?>
は、オブジェクトを取り出してObjectにキャストすることはできますが、何も入れることはできないというものです。