2017-10-09 5 views
2

Je suis en train de mettre en œuvre deux génériques fournisseur de tableau à deux dimensions dans Kotlin:Deux fournisseur Array générique dimensions

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

mais ne peut pas comprendre comment surmonter la question.

Le compilateur dit: interface ayant échoué: Pas assez d'informations pour déduire le paramètre T dans constructeur Array ( taille: Int, INIT: (Int) → T ) S'il vous plaît spécifier explicitement.

Répondre

3

D'abord, votre appel Array constructor intérieur manque son second paramètre init, le lambda où vous créez les premiers éléments que le Array contiendra. Si vous, par exemple, voulez remplir tout avec le même élément, vous pouvez passer que comme paramètre:

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

Vous pouvez également utiliser les indices extérieurs et intérieurs et créer des éléments initiaux basés sur ceux:

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

Si vous n'avez rien pour initialiser votre Array lorsque vous le créez, envisagez de créer un espace interne nul nul Array s avec arrayOfNulls.


Ils vous donneront toujours une erreur de ne pas être en mesure d'accéder T - voir this answer à une question connexe pour l'explication, mais vous aurez besoin de marquer votre T comme reified (et, par conséquent, votre fonction inline):

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