关于参数泛型的问题

来源:12-8 本章小结

慕妹6901783

2018-08-12

fun generateRandomArray(n: Int, rangeL: Int, rangeR: Int): Array<Int?> {

    assert(rangeL <= rangeR)

    val arr = arrayOfNulls<Int>(n)

    for (i in 0 until n) {
        arr[i] = (Math.random() * (rangeR - rangeL + 1) + rangeL).toInt()
    }
    return arr
}

// 打印arr数组的所有内容
fun printArray(arr: Array<Any?>) {

    for (i in arr.indices) {
        print(arr[i])
        print(' ')
    }
    println()

    return
}

我printArray接受的参数类型的泛型是Array<Any?>,在java里面Array<Int?>子类型是能传递进去的

但是编辑器报错是什么原因

写回答

2回答

bennyhuo

2018-08-13

型变的问题。印象中kotlin的数组不是协变的,java的是。

所以Array<Any?>和Array<Int?>是没有任何继承关系的。

但 Java 的 Integer[] 和 Number[] 是有继承关系的。这里面其实有一些比较取巧的地方,因为 Kotlin 在 jvm 上面其实也会把数组映射成 Java 的类型。

0
2
bennyhuo
回复
慕妹6901783
Array的定义你去看下,Array是不变的,所以即便 Array的泛型参数存在继承关系,但Array本身是不存在任何继成关系的。所以 Any 虽然是 Int 的父类,但 Array 跟 Array 没有半毛钱关系。
2018-08-16
共2条回复

慕妹6901783

提问者

2018-08-12

fun printArray(arr: Array<*>) {

    arr.forEach {
        print(it)
        print(" ")
        println()
    }

    return
}

我换成*类型以后就可以传递进去,不太清楚在这个参数传递时候kotlin和java的区别

0
0

Android首选开发语言Kotlin入门与进阶

Google I/O大会钦定Android一级开发语言,现在不学,等待何时

3122 学习 · 387 问题

查看课程