2017-10-09 12 views
2

二次元の一般的なアレイプロバイダ私はKotlinに、一般的な2次元配列のプロバイダを実装しようとしている

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

が、問題を克服する方法を見つけ出すことはできません。

コンパイラは言う:タイプのインターフェイスに失敗しました: コンストラクタアレイ のパラメータTを推測しないように十分な情報を明示的に指定(::INT、 のinit サイズ(INT)→T ) してください。

答えて

3

まず、あなたの内なるArray constructorコールは、その第二initパラメータ、あなたは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) 
       } 
      } 

あなたはそれを作成するときに、arrayOfNullsでNULL可能インナーArray Sを作成することを検討してあなたのArrayを初期化することは何もない場合。


これらは、まだあなたにTにアクセスできないというエラーが得られます - 説明については、関連する質問へthis answerを参照していますが、としてあなたのTreifiedとして(その結果、あなたの関数をマークする必要がありますinline):

inline fun <reified T> array2dim(sizeOuter: Int, sizeInner: Int, element: T) 
      : Array<Array<T>> 
      = Array(sizeOuter) { Array(sizeInner) { element } } 
関連する問題