Почему не компилируется Arrays.sort для массива из примитивов?
Почему такой код не скомпилируется?
int[] b = {1, 2, 3, 4, 5};
Arrays.sort(b, (o1, o2) -> Integer.compare(o2, o1));
Если я меняю тип массива на Integer[], то все работает:
Integer[] b = {1, 2, 3, 4, 5};
Arrays.sort(b, (o1, o2) -> Integer.compare(o2, o1));
Ответы (2 шт):
Автор решения: Serhii Dikobrazko
→ Ссылка
Потому что компаратор не знает какой тип у a и b
Integer.compare((int)o2, (int)o1))
Хотя оно будет работать из без компаратора
Автор решения: Vadik
→ Ссылка
Generics в Java устроены таким образом, что они не работают с примитивными типами, а только с объектами. Например, нельзя написать List<int>, но можно List<Integer>.
Таким образом, если внимательно посмотреть на сигнатуры методов Arrays.sort(), то увидим, что есть такие методы:
void sort(Object[] a)
void sort(int[] a)
<T> void sort(T[] a, Comparator<? super T> c)
Но нет такого:
void sort(int[] a, Comparator<Integer> c)
Значит, единственный способ отсортировать массив с помощью Arrays.sort() с использованием компаратора — скопировать int[] в Integer[]:
int[] primitives = {1, 2, 3, 4, 5};
Integer[] objects = new Integer[primitives.length];
Arrays.setAll(objects, i -> primitives[i]);
Arrays.sort(objects, (o1, o2) -> Integer.compare(o2, o1));