Generics 复制Kotlin数组减去特定索引处的元素
我试图编写一个Kotlin函数来复制一个数组,其中一个元素被切掉。到目前为止,我得到的是:Generics 复制Kotlin数组减去特定索引处的元素,generics,kotlin,types,Generics,Kotlin,Types,我试图编写一个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,
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()
}
内联索引(s:Array,i:Int):数组{
val r=阵列尺寸(s.尺寸-1)
系统阵列副本(s、0、r、0、i)
System.arraycopy(s,i+1,r,i,r.size-i)
返回r.requirenoulls()
}
它最初不会生成类型为t
的数组,但一旦添加了inline
和reified
关键字,它就会对该部分感到满意
它不会直接返回r
,因为r
是Array
类型,我想返回Array
,好吧,这是可以理解的
但是requirenoulls
不起作用;它似乎在说它想要Any
,取而代之的是T
,这似乎是类型系统的一个微妙的怪癖,而不是我对Java的理解
我做错了什么,解决这个问题的最佳方法是什么?requirenoulls()返回一个类型不可为null的数组。您的代码显示了一个错误,因为生成的数组的类型肯定是不可为空的,但是您的函数应该返回一个array
,其中T
可能为空
要指定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()
}
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>
}