父类能否作为子类的类型?及Kotlin中n1变量的类型困惑
Kotlin类型相关问题解答
1. 父类能否作为其子类的一种类型?
不行。面向对象继承体系遵循里氏替换原则:子类可以被当作父类的一种类型使用(比如Double可以赋值给Number类型变量),但反过来不成立——父类的实例可能是任意子类的对象,无法保证具备某个特定子类的特性,所以不能直接把父类当作子类的类型。
2. 变量n1的精确类型是什么?
变量n1存在两个层面的类型:
- 编译时静态类型:
Number(声明时指定的类型) - 运行时实际类型:
Double(赋值的758.3是Double实例,所以变量实际指向的对象是Double类型)
3. 为什么第3行var n2: Double = n1会编译错误?
编译器只识别变量的静态类型。n1的静态类型是Number,它可能是Double、Int、Float等任意Number子类的实例,编译器无法确定它一定是Double,所以直接赋值给Double类型变量会触发编译错误。必须显式做类型转换(比如n1 as Double)才能通过编译。
4. 为什么移除第3行后会打印Double?
is关键字是运行时类型检查,它判断的是变量实际指向的对象的类型,而非声明的静态类型。n1实际指向的是Double实例,所以n1 is Double会返回true,代码会执行第一个分支打印"Double"。虽然n1 is Number也成立,但条件判断是从上到下匹配的,第一个满足的分支会被执行,所以不会走到打印"Number"的分支。
内容的提问来源于stack exchange,提问作者Mohammad
相关产品推荐
相关产品推荐

