Без реализации интерфейса Comparable, как объект ArrayList использует Collection.sort () без ошибки? - PullRequest
0 голосов
/ 03 сентября 2018

Здесь ArrayList и его родительский класс и интерфейс никогда не реализовано Сравнимо , Все еще Collections.sort (al) скомпилировано без ошибки?

public class Collections_Demo {

    public static void main(String[] args) {

        ArrayList al= new ArrayList();
        al.add("ram");
        al.add("shaym");

        Collections.sort(al);
    }
}

Ответы [ 2 ]

0 голосов
/ 03 сентября 2018

Во-первых, ArrayList не обязательно должно быть Comparable. Вещи внутри списка массивов должны быть Comparable. Это подпись sort:

public static <T extends Comparable<? super T>> void sort(List<T> list) {

T ограничено, а не List.

Однако использование необработанных типов меняет все.

Поскольку вы написали ArrayList вместо ArrayList<String>, вы используете необработанный тип ArrayList. Это в основном стирает все параметры универсального типа и заставляет sort не проверять какие-либо ограничения. Это как если бы подпись стала:

public static void sort(List list) {

Вот почему вы смогли это назвать. Если бы вы поместили не Comparable вещи в список массивов, они бы потерпели крах во время выполнения:

ArrayList al= new ArrayList();
al.add(new Object());
al.add(new Object());

Collections.sort(al); // ClassCastException
0 голосов
/ 03 сентября 2018

Посмотрите на сигнатуру метода sort #

public static <T extends Comparable<? super T>> void sort(List<T> list) {
    list.sort(null);
}

Это означает, что не список должен реализовывать Comparable для возможности сортировки, а тип элементов списка.

В вашем случае String реализует Comparable, поэтому код компилируется и запускается без исключений

...