有一个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>,但是cloneArray<BaseData>(translators)调用中的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()
}
}
}发布于 2018-08-06 15:39:28
它是用关于varargs的Kotlin函数引用编写的
在函数中,
T类型的vararg参数作为T数组可见,即上面示例中的ts变量具有Array<out T>类型。
其中所引用的函数是:
function <T> asList(vararg ts: T): List<T>因此,在您的示例中,您实际上传递了一个Array<out BaseData>,但是您只接受一个类型为Array<T>?的数组(在您的例子中是Array<BaseData>)。您要么将所有类型都调整为Array<out T> (基本上类似于在Java中使用List<? extends BaseData> ),要么注意只处理T的问题,例如:
inline fun <reified T> cloneArray(array: Array<out T>?): Array<T>? {
return array?.clone()?.map { it }?.toTypedArray()
}但请查阅有关以下内容的文档:Kotlin泛型参考型投影。你也许能更容易地做到这一点。
https://stackoverflow.com/questions/51711002
复制相似问题