【发布时间】:2016-02-23 15:42:48
【问题描述】:
我正在尝试在 Kotlin 中创建一个非常简单的通用 NDArray 类,它将 lambda 表达式作为 init 函数。
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'作为具体类型参数。改用类”。为什么?
编辑:
如果我用我自己的 MyArray 替换 Kotlin Array 实现,它会编译:
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 与常规 Array 区别对待,因为两者都具有相同的构造函数?
【问题讨论】:
-
为什么不简单地
class NDArray<T>(i:Int, j:Int, f: (Int) -> T) { val values: Array<Int> = Array<Int>(i*j,f) }? -
绝对更简洁,但问题仍然存在,因为 Array 应该是 T 类型,而不是 Int。
-
非惯用的 Kotlin 代码难以阅读。请查看编辑
-
简洁明了。编辑接受,谢谢!
-
要让
MyArray像Array一样工作,它必须有一个reifiled T通用参数。目前只允许inline函数使用
标签: arrays generics kotlin type-erasure