Java Дженерики. Растолкуйте объявление

108
09 января 2021, 07:50

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) {...}

}~~~

Answer 1

? - это как 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.

READ ALSO
Распарсить сложный JSON-документ в HashSet

Распарсить сложный JSON-документ в HashSet

Имеется минимальный json-файлик с конфигами:

101
Как посмотреть тип переменной java?

Как посмотреть тип переменной java?

Я понимаю что в java "строгая типизация"Однако, если например я сделал множество приведений в коде и хочу вывести тип переменной в конце, как...

122
Про return более подробно?

Про return более подробно?

Начал изучать программирование и начал с языка Java и столкнулся с трудностью, поэтому прошу помощи

94