2012-05-30 4 views
0
Comparator<? super E> comparator() 

Этот метод объявлен в интерфейсе Sorted Set.Что означает этот метод?

Что означает супер?

Как этот метод отличается от общего метода и метод с аргументами подстановочных знаков.

+2

«Что такое diff»? –

+1

['comparator()'] (http://docs.oracle.com/javase/7/docs/api/java/util/SortedSet.html#comparator()) –

+1

Это «Возвращает компаратор, используемый для упорядочивания элементов в этом наборе или null, если этот набор использует естественное упорядочение его элементов ». В документах API также указывается «Возвраты: компаратор, используемый для упорядочивания элементов в этом наборе, или null, если этот набор использует естественный порядок его элементов». Вы спрашиваете о '' gobbledegook? –

ответ

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.

Я надеюсь, что это было полезно.

3

A SortedSet Для определения сортировки необходимо использовать некоторые правила, которые он использует. Comparator - это реализация этих правил. Интерфейс предоставляет метод получения ссылки на него, чтобы вы могли использовать его для других целей, таких как создание другого набора, который использует те же правила сортировки.

0

От javadoc:

«Возвращает компаратор, используемый для упорядочивания элементов в этом наборе, или нуль, если этот набор использует естественный порядок его элементов.»

:)

0

Ответ на это в объявлении интерфейса: public interface SortedSet<E> extends Set<E> { ...

Это означает, что любой класс, который implementsSortedSet должен указать, какой тип они будут работать с. Например

class MyClass implements SortedSet<AnotherClass> 

и это будет производить (с помощью Eclipse), куча методов, таких как

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

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

Из причины это будет работать со всеми подклассами AnotherClass, как Пол Варгас указал.

Другой аспект, который может отсутствовать, заключается в том, что Компаратор также является интерфейсом: 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()); 
     } 
    }); 
0

«Супер» здесь означает, что данный метод не обязан возвращать компаратор для Е. Это может вместо того, чтобы вернуть компаратор для любого суперкласса Е. Итак, чтобы сделать, что бетон, если Е были String, этот метод может дать вам более общий компаратор для объекта.

Общий метод объявит новый собственный общий параметр.Этот метод просто ссылается на общий параметр E, который был объявлен объявлением класса SortedSet<E>. Родовые методы реже. Они обычно статичны, как метод массивов

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

Здесь T объявляется и используется только в этом методе. Он показывает, что тип объектов в возвращаемом списке совпадает с типом объектов в параметре vararg.

Я не уверен, что точное определение аргументов дикой карты. ? Является символом дикой карты. Общая схема, когда вы получаете параметр wild card, такой как List<?>, состоит в том, что вы можете извлекать объекты из него и отбрасывать их объекту, но вы ничего не можете поместить.

Смежные вопросы