kotlin - 为什么翻译后的 kotlin 代码抱怨数组? 成为一个数组
问题描述
有一个java类,使用androidStudio翻译成kotlin。出现错误,不知道如何正确翻译。
的java代码:
public class BaseDataImpl extends BaseData {
private final BaseData[] translators;
public BaseDataImpl(final BaseData... translators) {
this.translators = cloneArray(translators);
}
public static <T> T[] cloneArray(final T[] array) {
if (array == null) {
return null;
}
return array.clone();
}
}
代码翻译后,得到错误:required Array<BaseData>?, found Array<out BaseData>
,但调用translators
中cloneArray<BaseData>(translators)
的定义为 val translators: Array<BaseData>?
,
谁能帮忙解释一下?
class BaseDataImpl(vararg translators: BaseData) : BaseData() {
private val translators: Array<BaseData>?
init {
this.translators = cloneArray<BaseData>(translators) //<=== error: required Array<BaseData>?, found Array<out BaseData>
}
companion object {
fun <T> cloneArray(array: Array<T>?): Array<T>? {
return array?.clone()
}
}
}
解决方案
在函数内部,类型的可变参数参数
T
作为 的数组可见T
,即上ts
例中的变量具有类型Array<out T>
。
其中引用的函数是:
function <T> asList(vararg ts: T): List<T>
因此,在您的情况下,您实际上传递了 anArray<out BaseData>
但您只接受类型数组Array<T>?
(在您的情况下Array<BaseData>
)。要么调整所有类型Array<out T>
(基本上与List<? extends BaseData>
Java 中所说的类似),要么注意只处理T
s ,例如:
inline fun <reified T> cloneArray(array: Array<out T>?): Array<T>? {
return array?.clone()?.map { it }?.toTypedArray()
}
但是请查看有关此的文档:Kotlin generics reference-type projections。您可能可以更轻松地完成此操作。
推荐阅读
- python - 如何读取、写入和列出谷歌存储桶中的文件夹和文件?
- solr - 加载类“solr.CurrencyFieldType”时出错
- python-asyncio - 相当于 Python 的“async def”函数中的“yield”
- google-cloud-firestore - Firestore 规则模拟器是否考虑了现有文档的实际集合?
- android - 使用动态变化的字段序列化传入的 JSON
- python - 如何打乱隐式对数组?
- storage - Openstack Hypervisor 本地存储增加大小
- regex - 逐行读取文件并替换字符串,打印到文件
- javascript - 从数据库加载时无法解析 ace 编辑器中的 javascript 标签
- apache-spark - 如何在 OLP 中覆盖 spark conf