Generics 为什么是科特林';s型&x27;s vararg被视为数组<;输出类型>;而不是数组<;类型>;
以下方法用Java编译: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
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)
}