У меня есть список классов, которые я хочу отсортировать:
class Student {
private Integer studentId;
private Double scoreA;
private Integer scoreB;
private Long scoreC;
// ... getter/setter...
}
И я хочу создать вспомогательный класс (с методами stati c), который можно использовать для сортировки Student
list:
public class SortHelper {
public static <T> void Sort(List<T> list, Function<T, Double> fn) { // Double
Collections.sort(list, Comparator.comparing(fn));
}
}
Тем не менее, вышеприведенный метод принимает только Double
- но я бы хотел передать весь объект Number
в метод:
public static <T> void Sort(List<T> list, Function<T, Number> fn) { // `Number`
Collections.sort(list, Comparator.comparing(fn)); // Error!
}
// so that I can do:
List<Student> students = loadStudents();
SortHelper.Sort(students, Student::getScoreA); // Double
SortHelper.Sort(students, Student::getScoreB); // Integer
SortHelper.Sort(students, Student::getScoreC); // Long
Когда я использую Number
вместо Double
выдает ошибку The method comparing(Function<? super T,? extends U>) in the type Comparator is not applicable for the arguments (Function<T,Number>)
Мои вопросы:
- Почему использование
Number
вместо Double
невозможно? - Как улучшить
SortHelper
, чтобы использовать Number
вместо Double
?
Пожалуйста, помогите мне! ..