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>
}