二维通用数组提供程序

时间:2017-10-09 12:32:07

标签: arrays generics multidimensional-array kotlin

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

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

但无法弄清楚如何克服这个问题。

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

1 个答案:

答案 0 :(得分:4)

首先,您的内部Array constructor调用缺少其第二个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时无法初始化Array,请考虑使用arrayOfNulls创建可为空的内T

这些仍然会给您一个关于无法访问T的错误 - 请参阅this answer相关问题以获取解释,但您需要将reified标记为inline(因此,您的职能为inline fun <reified T> array2dim(sizeOuter: Int, sizeInner: Int, element: T) : Array<Array<T>> = Array(sizeOuter) { Array(sizeInner) { element } } ):

<script type="text/javascript">alert("test")</script>