为什么翻译后的 kotlin 代码会抱怨 Array<BaseData>?成为一个数组<out BaseData>
why the translated kotlin code complains about a Array<BaseData>? to be a Array<out BaseData>
有javaclass,使用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()
}
}
}
写在Kotlin function reference regarding varargs:
Inside a function a vararg-parameter of type T
is visible as an array of T
, i.e. the ts
variable in the example above has type 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 generics reference - type projections。您可能可以更轻松地完成此操作。
有javaclass,使用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()
}
}
}
写在Kotlin function reference regarding varargs:
Inside a function a vararg-parameter of type
T
is visible as an array ofT
, i.e. thets
variable in the example above has typeArray<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 generics reference - type projections。您可能可以更轻松地完成此操作。