2013-12-16 2 views
0

Мне нужно построить класс Course, который имеет общее поле (я не могу добавить другое поле, содержащее Comparator).Java Generics and exetends Сопоставимый

мне нужно сделать Comparator к классу Course, чтобы можно было сравнить родовое поле, используя его собственный CompareTo метода (если String-compareTo строки, если целый и т.д ..):

Mothod getGeneric() возвращается общее поле.

new Comparator<Course<?>>({ 
    public int compare(Course<?> o1, Course<? extends Comparable<?>> o2) { 
     return (o1.getGeneric()).compareTo(o2.getGeneric()); 
    } 
}); 
+2

Пожалуйста, покажите свой текущий курс «Курс». – rgettman

ответ

5

То, что вы, вероятно, нужно сделать, это иметь метод, объявляющий сравнимую T и возвращает Comparator<Course<T>>.

public static <T extends Comparable<T>> Comparator<Course<T>> comparator() { 
    return new Comparator<Course<T>>() { 
     @Override 
     public int compare(Course<T> o1, Course<T> o2) { 
      // I don't want to give away TOO much. :) 
     } 
    } 
} 

Есть способы сделать это без создания нового экземпляра каждый раз, но они требуют обходя систему типов, поэтому они более продвинутые. Вышеприведенное должно быть хорошо для большинства случаев использования.

Вы также мог бы иметь, что comparator функции взять Comparator<T> сами:

public static <T> Comparator<Course<T>> comparator(Comparator<T> innerComparator) { 
    ... 
} 

Это дает вам дополнительную гибкость, а также возможность создавать компараторы для типов, которые не имеют естественные сравнений (то есть, что не применять Comparable). Например, вы можете создать Comparator<Course<Course<Integer>>>!

+1

для наилучших результатов использования '>' – newacct