Arrays 创建具有新大小的通用数组的副本

Arrays 创建具有新大小的通用数组的副本,arrays,generics,kotlin,Arrays,Generics,Kotlin,在Kotlin中,如果我已经有了一个通用数组的实例并为其项传递了构造方法,是否可以创建一个具有新大小的通用数组的副本?我会这样想: fun <T> resize(arr: Array<T>, newSize: Int, creator: (Int) -> T): Array<T> { ... } fun resize(arr:Array,newSize:Int,creator:Int)->T):数组{ ... } 显然,我不能调用Array(

在Kotlin中,如果我已经有了一个通用数组的实例并为其项传递了构造方法,是否可以创建一个具有新大小的通用数组的副本?我会这样想:

fun <T> resize(arr: Array<T>, newSize: Int, creator: (Int) -> T): Array<T> {
    ...
}
fun resize(arr:Array,newSize:Int,creator:Int)->T):数组{
...
}

显然,我不能调用
Array(newSize){I->creator(I)}
,因为类型
T
在编译时是未知的。出于效率原因,我不想使用具有具体化类型的内联函数。我也不能在这里使用
arr.copyOf(newSize)
方法,因为这将返回一个
数组


在Java中,我甚至可以使用
Arrays.copyOf(arr,newSize)
,因为这里没有空安全性。但这在科特林也行吗?或者你对我能做什么有其他想法吗?

我想这会有用的:

fun <T> resize(arr: Array<T>, dest: Array<T>, creator: (Int) -> T): Array<T> {
    val list = arrayListOf<T>()
    // fill the list
    for (i in 0 until dest.size) {
        list.add(creator(i))
    }
    return list.toArray(dest)
}

fun callResize() {
    val arr = Array(5) { " " }
    val dest = Array(10) { "" }
    val creator = { i: Int -> "$i"}
    resize(arr, dest, creator)
}
fun resize(arr:Array,dest:Array,creator:(Int)->T):数组{
val list=arrayListOf()
//填写清单
用于(在目标尺寸前输入0){
列表.添加(创建者(一))
}
返回列表。toArray(目的地)
}
趣味callResize(){
val arr=数组(5){'}
val dest=数组(10){'}
val creator={i:Int->“$i”}
调整大小(arr、dest、创建者)
}

结果出现在
dest
数组中。

我想这会起作用:

fun <T> resize(arr: Array<T>, dest: Array<T>, creator: (Int) -> T): Array<T> {
    val list = arrayListOf<T>()
    // fill the list
    for (i in 0 until dest.size) {
        list.add(creator(i))
    }
    return list.toArray(dest)
}

fun callResize() {
    val arr = Array(5) { " " }
    val dest = Array(10) { "" }
    val creator = { i: Int -> "$i"}
    resize(arr, dest, creator)
}
fun resize(arr:Array,dest:Array,creator:(Int)->T):数组{
val list=arrayListOf()
//填写清单
用于(在目标尺寸前输入0){
列表.添加(创建者(一))
}
返回列表。toArray(目的地)
}
趣味callResize(){
val arr=数组(5){'}
val dest=数组(10){'}
val creator={i:Int->“$i”}
调整大小(arr、dest、创建者)
}

结果是在
dest
数组中。

为此,我只想在
数组中添加一个扩展方法。您仍然可以依赖引擎盖下的
array.copyOf
,但在返回值之前,请使用
creator
块的结果填充所有剩余空间:

fun <T> Array<T>.resize(newSize: Int, creator: (Int) -> T): Array<T> {
    val copiedArray = Arrays.copyOf(this, newSize)
    for (i in size until newSize) { copiedArray[i] = creator(i) }
    return copiedArray
}

为此,我只想在
Array
中添加一个扩展方法。您仍然可以依赖引擎盖下的
array.copyOf
,但在返回值之前,请使用
creator
块的结果填充所有剩余空间:

fun <T> Array<T>.resize(newSize: Int, creator: (Int) -> T): Array<T> {
    val copiedArray = Arrays.copyOf(this, newSize)
    for (i in size until newSize) { copiedArray[i] = creator(i) }
    return copiedArray
}

谢谢,效果很好:)我不知道Kotlin没有默认提供这个,但这是可能的,因为我已经有了该数组的一个实例,对吗?我无法使用此方法创建泛型类型的全新数组,对吗?正确,但您可以使用@Sergey在下面使用的内置函数——例如
array(size){index->index.toString()}
谢谢,效果很好:)我不知道Kotlin默认情况下不提供此功能,但这只是因为我已经有了该阵列的实例,对吗?我无法使用此方法创建泛型类型的全新数组,对吗?正确,但您可以使用@Sergey在下面使用的内置函数——例如
array(size){index->index.toString()}
“出于有效的原因,我不想使用具有具体类型的内联函数。”为什么?通过内联
creator
“出于有效的原因,我不想使用具有具体化类型的内联函数”,它应该更有效。为什么?通过内联
creator
,它应该更高效。