Почему Arrays.sort использует Object[], а не Comparable[]?

Мне было интересно, почему метод сортировки класса Arrays запрашивает параметр типа Object[]. Почему параметр не имеет тип Comparable[]. Если вы не передадите Comparable[], он генерирует ClassCastException.

Почему... public static void sort(Object[] a), а не public static void sort(Comparable[] a)? Спасибо


person Joel    schedule 11.02.2010    source источник
comment
У вас такая же ситуация в других местах API Java, например. ObjectOutputStream, который ожидает объект, реализующий Serializable. Я думаю, разработчики пытались помешать нам делать ненужные приведения.   -  person ZeissS    schedule 11.02.2010
comment
В свое время JDK реализовывали несколько человек, а не только Sun. Реализации класса, возможно, желали Comparable, но допускали любую детерминированную, стабильную сортировку. (Гипотетически говоря)   -  person Kylar    schedule 11.02.2010


Ответы (2)


Потому что вторая форма потребует перераспределения массива. Даже если вы знаете, что ваш массив содержит только сопоставимые объекты, вы не можете просто привести его к Comparable[], если исходный тип был Object[], поскольку тип массива не совпадает.

Ты можешь сделать:

Object[] arr = new String[0];
String[] sarr = (String[]) arr;

Но вы не можете сделать:

Object[] arr = new Object[0];
String[] sarr = (String[]) arr;

Так что это преждевременная оптимизация :)

person Alexander Torstling    schedule 11.02.2010

В противном случае вы не сможете передать Object[].

person BalusC    schedule 11.02.2010
comment
@BalusC Бывает ли когда-нибудь ситуация, когда вы переходите к сортировке массива объектов, о которых вы не знали, что все они реализуют Comparable? Любое использование метода сортировки будет осуществляться по объектам, которые являются Comparable. Похоже, единственная причина для принятия Object[] заключается в том, что Object используется чаще и более знакомо, и, как сказал ZeissS, в противном случае нам пришлось бы применять кастинг. - person Jonathon Faust; 11.02.2010
comment
В Java API по-прежнему существует множество методов, подобных toArray(), которые возвращают Object[]. - person BalusC; 11.02.2010
comment
Они могут реализовать Comparator<T>, который похож, но не совпадает с Comparable<T>. - person chama; 11.02.2010