请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

关于参数泛型的问题

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?>子类型是能传递进去的

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

正在回答 回答被采纳积分+3

2回答

bennyhuo 2018-08-13 08:37:53

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

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

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

0 回复 有任何疑惑可以回复我~
  • 提问者 慕妹6901783 #1
    虽然在kotlin中Any是所有对象的父类,但是不能单纯的这样理解,还要注意特定情况下的泛型的型变问题?
    回复 有任何疑惑可以回复我~ 2018-08-15 16:30:39
  • bennyhuo 回复 提问者 慕妹6901783 #2
    Array的定义你去看下,Array是不变的,所以即便 Array的泛型参数存在继承关系,但Array本身是不存在任何继成关系的。所以 Any 虽然是 Int 的父类,但 Array<Any> 跟 Array<Int> 没有半毛钱关系。
    回复 有任何疑惑可以回复我~ 2018-08-16 18:43:11
提问者 慕妹6901783 2018-08-12 13:14:04
fun printArray(arr: Array<*>) {

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

    return
}

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

0 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信