二维通用数组提供者

我试图在Kotlin中实现通用的二维数组提供程序:

public fun <T> array2dim(sizeOuter: Int, sizeInner: Int): Array<Array<T>> = Array(sizeOuter) { Array(sizeInner) } 

但无法弄清楚如何解决这个问题。

编译器说: 类型接口失败:没有足够的信息来推断构造函数中的参数T Array(size:Int,init:(Int)→T)请明确指定。

首先,您的内部Array构造函数调用缺少其第二个init参数,lambda,您在其中创建Array将包含的初始元素。 如果你想用相同的元素来填充它,你可以把它作为参数传递给它:

 fun <T> array2dim(sizeOuter: Int, sizeInner: Int, element: T): Array<Array<T>> = Array(sizeOuter) { Array(sizeInner) { element } } 

您也可以使用外部和内部索引,并基于这些索引创建初始元素:

 fun <T> array2dim(sizeOuter: Int, sizeInner: Int, createElement: (Int, Int) -> T): Array<Array<T>> = Array(sizeOuter) { outerIndex -> Array(sizeInner) { innerIndex -> createElement(outerIndex, innerIndex) } } 

如果在创建时没有任何初始化Array ,请考虑使用arrayOfNulls创建可空的内部Array


这些仍然会给你一个关于不能访问T的错误 – 请看这个解答的相关问题的答案,但是你需要把你的T标记为reified (因此你的函数是inline ):

 inline fun <reified T> array2dim(sizeOuter: Int, sizeInner: Int, element: T) : Array<Array<T>> = Array(sizeOuter) { Array(sizeInner) { element } }