Generics 为什么是科特林';s型&x27;s vararg被视为数组<;输出类型>;而不是数组<;类型>;

Generics 为什么是科特林';s型&x27;s vararg被视为数组<;输出类型>;而不是数组<;类型>;,generics,kotlin,variadic-functions,Generics,Kotlin,Variadic Functions,以下方法用Java编译: public class Main { public static void main(String[] args) { varargMethod(1, 2.0); } static void varargMethod(Number... va) { arrayMethod(va); } static void arrayMethod(Number[] arr) { for (N

以下方法用Java编译:

public class Main {
    public static void main(String[] args) {
        varargMethod(1, 2.0);
    }

    static void varargMethod(Number... va) {
        arrayMethod(va);
    }

    static void arrayMethod(Number[] arr) {
        for (Number number : arr) {
            System.out.println(number);
        }
    }
}
如果我尝试在Kotlin中编写类似的代码,则会出现类型不匹配错误:

fun main() {
    varargFun(1, 2.0)
}

fun varargFun(vararg va: Number) {
    arrayFun(va) // Error:(6, 14) Kotlin: Type mismatch: inferred type is Array<out Number> but Array<Number> was expected
}

fun arrayFun(arr: Array<Number>) {
    arr.forEach {
        println(it)
    }
}
fun main(){
varargFun(1,2.0)
}
varargFun(vararg va:编号){
arrayFun(va)//错误:(6,14)Kotlin:类型不匹配:推断的类型为Array,但应为Array
}
趣味阵列风(arr:Array){
阿弗雷奇{
println(it)
}
}
我希望
va
属于
Array
类型,但它是
Array
。如果我将其强制转换为数组:
va
,我会收到一条警告:

警告:(6,21)Kotlin:未选中强制转换:数组到数组

如何将
vararg
作为
数组
传递给另一个函数,而不会收到警告和错误?

在函数内部,一个
vararg
-类型为
T
的参数作为
T
的数组可见,即上面示例中的[…]变量的类型为
array

解决问题的方法很简单:忽略Kotlin的护栏,然后


区别在于Java中的数组是协变的,即以下是有效的:

public static void main(String[] args) {
    Number[] numbers = new Number[0];
    Integer[] ints = new Integer[0];

    numbers = ints;
}
var numbers: Array<out Number> = arrayOf() // we will only extract Numbers out of this array
val ints: Array<Int> = arrayOf()

numbers = ints // this is ok
但是,数组在Kotlin中不是协变的,即,下面给出了一个编译错误:

var numbers: Array<Number> = arrayOf()
val ints: Array<Int> = arrayOf()

numbers = ints // error: required Array<Number>, found Array<Int>
鉴于此,如果
vararg va:Number
未被视为
数组
,那么您可以仅使用
Number
对象而不是其子类调用方法。即,以下操作将失败:

fun main() {
    varargFun(arrayOf<Int>(1, 2)) // error: required Array<Number>, found Array<Int>
}

fun varargFun(va: Array<Number>) {
    arrayFun(va)
}

您可以将数组函数声明为
funArrayFun(arr:array)
fun main() {
    varargFun(arrayOf<Int>(1, 2)) // error: required Array<Number>, found Array<Int>
}

fun varargFun(va: Array<Number>) {
    arrayFun(va)
}
fun main() {
    varargFun(arrayOf<Int>(1, 2))
}

fun varargFun(va: Array<out Number>) {
    arrayFun(va)
}