gpt4 book ai didi

arrays - 具有泛型返回类型的 lambda 构造函数的 Kotlin NDArray

转载 作者:行者123 更新时间:2023-12-02 04:01:51 24 4
gpt4 key购买 nike

我正在尝试在 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) {
...
}

不知道为什么当 MyArray 具有相同的构造函数时,Kotlin 对待 MyArray 的方式与常规 Array 不同?

最佳答案

创建 Java 数组需要指定元素类型。对于您的类,元素类型仅作为类的类型参数提供,并且 Java 中的泛型会在运行时被删除。因此,数组的元素类型未知,因此无法创建它。

如果您想围绕标准 Array<T> 创建自定义包装器,它必须如下所示:

class NDArray<reified T>(i:Int, j:Int, init: (Int) -> T) {
val arr = Array<T>(i * j, init)
}

reified关键字意味着您的 T不会被删除,并且可以在需要真实类的地方使用,例如调用 Array()构造函数。

请注意,类构造函数不支持此语法,但它对于工厂函数仍然有用(必须是 inline d)

fun <reified T> arrayFactory(i:Int, j:Int, init: (Int) -> T) = Array<T>(i * j, init)

关于arrays - 具有泛型返回类型的 lambda 构造函数的 Kotlin NDArray,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35581867/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com