gpt4 book ai didi

generics - 复制 Kotlin 数组减去特定索引处的元素

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

我正在尝试编写一个 Kotlin 函数来复制一个删除了一个元素的数组。这是我到目前为止所得到的:

inline fun <reified T> minusIndex(s: Array<T>, i: Int): Array<T> {
val r = arrayOfNulls<T>(s.size - 1)
System.arraycopy(s, 0, r, 0, i)
System.arraycopy(s, i + 1, r, i, r.size - i)
return r.requireNoNulls()
}

它最初不会创建类型为 T 的数组。 ,但对 inline 后的那部分很满意和 reified添加了关键字。

它不会返回 r直,因为 rArray<T?> 类型我想返回 Array<T> ,好吧,这可以理解。

但是 requireNoNulls不工作;它似乎在说它想要 Any并且正在获取 T相反,这似乎是类型系统的一个微妙的怪癖,而不是我对 Java 的理解所涵盖的。

我做错了什么,解决这个问题的最佳方法是什么?

最佳答案

requireNoNulls()返回一个不可为空类型的数组。您的代码显示错误,因为结果数组的类型绝对不可为空,但您的函数应该返回 Array<T>在哪里 T可能为空。

指定 T不可为空,您可以指定它扩展 Any而不是 Any? 的默认值.

inline fun <reified T: Any> minusIndex(s: Array<T>, i: Int): Array<T> {
val r = arrayOfNulls<T>(s.size - 1)
System.arraycopy(s, 0, r, 0, i)
System.arraycopy(s, i + 1, r, i, r.size - i)
return r.requireNoNulls()
}

然而,如果你想让这个函数在具有可空类型的数组上工作,你将不得不强制转换 r。至 T .您可以禁止未经检查的强制转换警告。我们知道这是一个安全的强制转换,因为您已经用 T 类型的某些元素填充了新数组的每个索引。 ,无论它是否可以为空:
inline fun <reified T> minusIndex(s: Array<T>, i: Int): Array<T> {
val r = arrayOfNulls<T>(s.size - 1)
System.arraycopy(s, 0, r, 0, i)
System.arraycopy(s, i + 1, r, i, r.size - i)
@Suppress("UNCHECKED_CAST")
return r as Array<T>
}

关于generics - 复制 Kotlin 数组减去特定索引处的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61670129/

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