2

I'm trying to implement generic two dimensional array provider in Kotlin:

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

but can't figure out how to overcome the issue.

The compiler says: Type interface failed: Not enough information to infer parameter T in constructor Array ( size: Int, init: (Int) → T ) Please specify it explicitly.

user102008
  • 30,736
  • 10
  • 83
  • 104
Jocky Doe
  • 2,041
  • 4
  • 17
  • 28

1 Answers1

4

First, your inner Array constructor call is missing its second init parameter, the lambda where you create the initial elements that the Array will contain. If you, say, want to fill it all with the same element, you could pass that as a parameter:

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

You could also use the outer and inner indexes and create initial elements based on those:

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

If you have nothing to initialize your Array with when you create it, consider creating nullable inner Arrays with arrayOfNulls.


These will still give you an error about not being able to access T - see this answer to a related question for the explanation, but you'll need to mark your T as reified (and consequently, your function as inline):

inline fun <reified T> array2dim(sizeOuter: Int, sizeInner: Int, element: T)
            : Array<Array<T>>
            = Array(sizeOuter) { Array(sizeInner) { element } }
zsmb13
  • 85,752
  • 11
  • 221
  • 226