какой смысл перегрузки метода sort в классе Arrays - PullRequest
0 голосов
/ 25 апреля 2019

Я считаю, что метод sort() в классе Arrays не тот же из-за типа параметра, но некоторая логика такая же.

Например, если параметр long, метод такой же, как параметр Integer. Так в чем смысл перегрузки метода. Другими словами, код может быть короче, но почему он так длинен?

Ответы [ 3 ]

3 голосов
/ 25 апреля 2019

когда параметр long, метод такой же, как параметр integer.

Это не int и long, а int[] и long[]. Это важно.

Например, расширяются примитивные преобразования для int и long.

int i = 10;
long l = i;

Однако int[] и long[] - это абсолютно разные типы, и подобные удобные преобразования не поддерживаются. Чтобы передать int[] в method(long[]), необходимо выполнить преобразование int[] в long[] вручную.

int[] iA = {10, 10};
long[] lA = Arrays.stream(iA).asLongStream().toArray();

С точки зрения хорошего API это не удобно. Идея состоит в том, чтобы позволить пользователю работать с типом, который он получил изначально, и не принуждать его к ручным (обычно подверженным ошибкам) ​​преобразованиям. Итак, дело в удобстве .

1 голос
/ 25 апреля 2019

Если у вас есть целочисленные массивы int[], вы не можете передать их в Arrays#sort(long[]) (и наоборот), потому что они разных типов.Таким образом, вам нужны сигнатуры методов для всех типов примитивных массивов.Кроме того, нет общего супертипа, который можно было бы использовать в качестве типа параметра.

Встречный вопрос: Если вы не перегружаете метод #sort, какие типы параметров вы бы предложили использовать для #sort метод, позволяющий передавать типы сортировки int[] и long[]?


// Обновление после вашего вопроса в комментариях относительно кастинга:

Нет, вы не можете разыграть от int[] до long[] или наоборот.Следующий код не компилируется:

int[] myIntArray = {1, 2, 3};

Arrays.sort((long[]) myIntArray); // COMPILE ERROR

Что вы можете сделать, это следующее (требуется Java 8):

int[] myIntArray = {1, 2, 3};
long[] myCastedArray = Arrays.stream(myIntArray).asLongStream().toArray();

Arrays.sort(myCastedArray); // #sort(long[])

Кстати, хотя вы заявили, что ответ Андрея Тобилко вам не поможет, вы должны попытаться понять, что он говорит вам.Я также думаю, что вы обязательно поймете разницу между int/long (примитив) и int[]/long[] (массив примитивов).

0 голосов
/ 25 апреля 2019

Поскольку тип элементов различен, вам необходимо соответствующим образом реализовать метод sort.

Ключевое слово полиморфизм ;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...