1

有一个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>,但调用translatorscloneArray<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()
        }
    }

}
4

1 回答 1

3

它写在Kotlin 函数参考中关于 varargs

在函数内部,类型的可变参数参数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 中所说的类似),要么注意只处理Ts ,例如:

inline fun <reified T> cloneArray(array: Array<out T>?): Array<T>? {
        return array?.clone()?.map { it }?.toTypedArray()
}

但是请查看有关此的文档:Kotlin generics reference-type projections。您可能可以更轻松地完成此操作。

于 2018-08-06T15:39:28.603 回答