请稍等 ...
×

采纳答案成功!

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

关于参数泛型的问题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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
1
2
3
4
5
6
7
8
9
10
fun printArray(arr: Array<*>) {
 
    arr.forEach {
        print(it)
        print(" ")
        println()
    }
 
    return
}

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

0 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号