Копирование массива Kotlin минус элемент по определенному индексу - PullRequest
1 голос
/ 08 мая 2020

Я пытаюсь написать функцию Kotlin для копирования массива с одним вырезанным элементом. Вот что у меня есть на данный момент:

inline fun <reified T> minusIndex(s: Array<T>, i: Int): Array<T> {
    val r = arrayOfNulls<T>(s.size - 1)
    System.arraycopy(s, 0, r, 0, i)
    System.arraycopy(s, i + 1, r, i, r.size - i)
    return r.requireNoNulls()
}

Изначально он не создавал бы массив типа T, но доволен этой частью, когда ключевые слова inline и reified добавлено.

Он не вернет r прямо, потому что r имеет тип Array<T?>, и я хочу вернуть Array<T>, хорошо, это понятно.

Но requireNoNulls не работает; похоже, он говорит, что хочет Any, а вместо этого получает T, что кажется более тонкой причудой системы типов, чем охватывается моим пониманием, перенесенным из Java.

What am Я делаю неправильно, и как лучше всего решить эту проблему?

1 Ответ

2 голосов
/ 08 мая 2020

requireNoNulls() возвращает массив с типом, не допускающим значения NULL. Ваш код показывает ошибку, потому что тип результирующего массива определенно не допускает значения NULL, но ваша функция должна возвращать Array<T>, где T потенциально допускает значение NULL.

Чтобы указать, что T не- с нулевым значением, вы можете указать, что он расширяет Any, а не по умолчанию Any?.

inline fun <reified T: Any> minusIndex(s: Array<T>, i: Int): Array<T> {
    val r = arrayOfNulls<T>(s.size - 1)
    System.arraycopy(s, 0, r, 0, i)
    System.arraycopy(s, i + 1, r, i, r.size - i)
    return r.requireNoNulls()
}

Однако, если вы хотите, чтобы эта функция работала даже с массивами с типом, допускающим значение NULL, вы должны необходимо преобразовать r в T. Вы можете подавить непроверенное предупреждение о касте. Мы знаем, что это безопасное приведение, потому что вы заполнили каждый индекс нового массива некоторым элементом типа T, независимо от того, допускает ли он значение NULL:

inline fun <reified T> minusIndex(s: Array<T>, i: Int): Array<T> {
    val r = arrayOfNulls<T>(s.size - 1)
    System.arraycopy(s, 0, r, 0, i)
    System.arraycopy(s, i + 1, r, i, r.size - i)
    @Suppress("UNCHECKED_CAST")
    return r as Array<T>
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...