Я пытаюсь создать очень простой общий класс NDArray в Котлине, который принимает выражение лямбда как функцию init.Kotlin NDArray с конструктором лямбда с общим типом возврата
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
Моя проблема заключается в том, что компилятор Котлин жалуется на инициализации значений в конструкторе
values = Array(i * j, f)
, говоря: «Не удается использовать«T 'в качестве параметра типа reified. Вместо этого используйте класс. Зачем ?
EDIT:
Если я вместо этого заменить реализацию массива Котлин с моим собственным 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) {
...
}
Не знаю, почему Котлин лечит MyArray отличается от обычного массива, когда оба имеют одинаковый конструктор?
почему не просто класс 'NDArray (я: Int, J: Int, F: (Int) -> T) { значения знач: Array = Массив (я * J, f) } '? –
voddan
Определенно более кратким, но проблема все еще сохраняется, поскольку массив должен иметь тип T, а не Int. –
Неидиоматический код Котлина трудно читать. См. Edit – voddan