Почему не компилируется 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));
→ Ссылка