Java Дженерики. Растолкуйте объявление для чайников, сигнатуру объявления что делает ? super T читаю, не особо могу вникнуть
public static <T extends Comparable<? super T>> void sort(List<T> list) {...}
public class MergeSort {
public static <T extends Comparable<? super T>> void sort(List<T> list) {...}
}~~~
? - это как generic T, но вы его не сможете использовать в качестве класса, знак вопроса говорит о том что не важно какой это будет класс, это необходимо как раз для конструкций с применением extends и super в дженериках.
? extends T - означает, что любой, указанный в generic, класс ? обязан быть наследником T
В то же время
? super T - означает, что любой, указанный в generic, класс ? обязан быть родителем T
Пример:
public class Animal {
int age;
}
public class Cat extends Animal implements Comparable<Animal> {
@Override public int compareTo(Animal that) {
// компаратор для сравнения кошек с другими животными
}
}
public class Dog extends Animal implements Comparable<Animal> {
@Override public int compareTo(Animal that) {
// компаратор для сравнения собак с другими животными
}
}
class ByAgeAsc implements Comparator<Animal> { //общий компаратор для животных по возрасту
@Override public int compare(Animal a, Animal b) {
return a.getAge() < b.getAge();
}
}
List<Animal> animals = new ArrayList<>();
animals.add(new Cat(5)); // коту 5 лет
animals.add(new Dog(10)); //собаке 10 лет
Collections.sort(students, new ByAgeAsc()); //сортируем по возрасту
По сути объявление generic
в sort
можно прочитать как:
Метод сортировки использует определяемый позднее класс T
, который должен быть наследником класса или реализовывать интерфейс Comparable
, в котором объявленный позднее класс ?
(неиспользуемый в дальнейшем коде) будет классом родителем или интерфейсом класса T
.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Я понимаю что в java "строгая типизация"Однако, если например я сделал множество приведений в коде и хочу вывести тип переменной в конце, как...
Начал изучать программирование и начал с языка Java и столкнулся с трудностью, поэтому прошу помощи