Я пытаюсь создать очень простой общий класс NDArray в Kotlin, который принимает лямбда-выражение в качестве функции инициализации.
class NDArray<T>(i: Int, j: Int, f: (Int) -> T) {
val values: Array<T> = Array(i * j, f)
}
Типичное использование:
fun main(args: Array<String>){
val m = NDArray(4, 4, ::zero)
}
fun zero(i: Int) = 0.0
Моя проблема в том, что компилятор Kotlin жалуется на инициализацию значений в конструкторе
values = Array(i * j, f)
говоря: «Невозможно использовать« T »в качестве параметра типа. Вместо этого используйте класс». Почему ?
ИЗМЕНИТЬ:
Если вместо этого я заменю реализацию массива Kotlin своим собственным MyArray, он скомпилируется:
class NDArray<T>(i: Int, j: Int, f: (Int) -> T) {
val values: MyArray<T> = MyArray(i * j, f)
}
class MyArray<T>(i:Int, init: (Int) -> T) {
...
}
Не знаете, почему Kotlin обрабатывает MyArray иначе, чем обычный массив, когда оба имеют один и тот же конструктор?
class NDArray<T>(i:Int, j:Int, f: (Int) -> T) { val values: Array<Int> = Array<Int>(i*j,f) }
? - person voddan   schedule 23.02.2016MyArray
действовал какArray
, он должен иметь общий параметрreifiled T
. Пока это разрешено только дляinline
функций. - person voddan   schedule 24.02.2016