Как передать массив целых чисел методу, ожидающему `Array <T>`?

Я преобразовал java shellSort в Kotlin. Проблема в том, что я понятия не имею, чтобы назвать этот метод.

Ява

package Sorts; public class ShellSort extends Sorter{ @Override public <T extends Comparable<? super T>> void sort(T[] a) { int h = 1; while((h*3+1) < a.length) h = 3*h+1; while(h > 0){ for(int i = h-1; i < a.length; i++){ T s = a[i]; int j = i; for(j = i; (j>=h) && (a[jh].compareTo(s) > 0); j-=h) a[j] = a[jh]; a[j] = s; } h /= 3; } } } 

Котлин

 fun <T : Comparable<T>> shellSort(a: Array<T>) { var h = 1 while (h * 3 + 1 < a.size) h = 3 * h + 1 while (h > 0) { for (i in h - 1..a.size - 1) { val s = a[i] var j = i j = i while (j >= h && a[j - h].compareTo(s) > 0) { a[j] = a[j - h] j -= h } a[j] = s } h /= 3 } } 

То, что я пытался вызвать, – это cast intArray для массива

  val array = intArrayOf(5, 3, 0, 2, 4, 1, 0, 5, 2, 3, 1, 4) shellSort(arrayOf(array)) 

Что происходит с ошибкой

введите описание изображения здесь

 Type parameter bound for T in fun <T : Comparable<T>> shellSort(a: Array<T>) : Unit is not satisfied: inferred type IntArray is not a subtype of Comparable<IntArray> 

intArrayOf возвращает IntArray который не расширяет Array<Int> как можно было бы предположить. Как указано в документации, Kotlin предоставляет специализированные типы массивов для различных примитивов, которые избегают боковых накладных расходов. IntArray соответствует int[] . Для метода ShellSort.sort (как для Kotlin, так и для Java) требуются версии в коробке.

Вы можете преобразовать IntArray в Array<Int> используя toTypedArray расширения toTypedArray например:

 val array = intArrayOf(5, 3, 0, 2, 4, 1, 0, 5, 2, 3, 1, 4).toTypedArray() shellSort(array) 

Или, как @KirillRakhman предложил создать коробку версию напрямую:

 shellSort(arrayOf(5, 3, 0, 2, 4, 1, 0, 5, 2, 3, 1, 4)) 

Эта строка

 shellSort(arrayOf(array)) 

не IntArray array к регулярному Array<Integer> , но переносит его в одноэлементный массив типа Array<IntArray> . Используйте IntArray.toTypedArray() чтобы преобразовать его в общий массив, как предположил @miensol .