为何java.math.BigInteger可赋值给kotlin.Number却不能赋值给java.lang.Number
Kotlin BigInteger与Number类型赋值问题解答
为什么java.math.BigInteger可以赋值给kotlin.Number类型变量
Kotlin为了实现跨平台能力,在标准库中定义了独立的kotlin.Number抽象类,在JVM平台运行时,这个类型会被直接映射为Java的java.lang.Number。java.math.BigInteger本身就是java.lang.Number的子类,Kotlin编译器做了专门的适配:所有Java中继承了java.lang.Number的类,在Kotlin类型体系里都会被自动识别为kotlin.Number的子类型,不需要显式写继承声明,所以val x: Number = BigInteger.ONE 是完全合法的赋值。
为什么val x: java.lang.Number = BigInteger.ONE会触发编译错误
在Kotlin的类型体系里,kotlin.Number和java.lang.Number是两个互相独立的类型声明,只有编译生成字节码的时候才会被擦成同一个类。
针对这种已经做了平台映射的Java基础类型,Kotlin编译器不会做双向的类型兼容处理:BigInteger在Kotlin里只会被识别为kotlin.Number的子类,和java.lang.Number没有继承关联,所以把它赋值给显式声明为java.lang.Number的变量,编译器就会报类型不匹配的错误。
内容的提问来源于stack exchange,提问作者k314159
相关产品推荐
相关产品推荐

