首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么翻译的kotlin代码抱怨Array<BaseData>?成为Array<out BaseData>

为什么翻译的kotlin代码抱怨Array<BaseData>?成为Array<out BaseData>
EN

Stack Overflow用户
提问于 2018-08-06 15:27:24
回答 1查看 33关注 0票数 1

有一个java类,使用androidStudio将其转换为kotlin。得到一个错误,不知道如何正确翻译它。

java代码:

代码语言:javascript
复制
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>?

有人能帮忙解释吗?

代码语言:javascript
复制
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()
        }
    }

}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-06 15:39:28

它是用关于varargs的Kotlin函数引用编写的

在函数中,T类型的vararg参数作为T数组可见,即上面示例中的ts变量具有Array<out T>类型。

其中所引用的函数是:

代码语言:javascript
复制
function <T> asList(vararg ts: T): List<T>

因此,在您的示例中,您实际上传递了一个Array<out BaseData>,但是您只接受一个类型为Array<T>?的数组(在您的例子中是Array<BaseData>)。您要么将所有类型都调整为Array<out T> (基本上类似于在Java中使用List<? extends BaseData> ),要么注意只处理T的问题,例如:

代码语言:javascript
复制
inline fun <reified T> cloneArray(array: Array<out T>?): Array<T>? {
        return array?.clone()?.map { it }?.toTypedArray()
}

但请查阅有关以下内容的文档:Kotlin泛型参考型投影。你也许能更容易地做到这一点。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51711002

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档