基本数据类型
不同于 Java 分基础类型和包装类,在 Kotlin 里只有一种。这样做的好处是既能赋值也能调用方法,还能直接用于集合类。但这样也带来了效率问题,Kotlin 在变量属性,参数和返回值情况时会转成 Java 对应的基础类型,保证效率,而在泛型实现上只能用包装类。
考虑到 Kotlin 里,Int 和 Int? 其实是两种类型,后者因为要包含 null 值,所以后者一直都会转换为 Java 的包装类。
在属性定义时,本来想用 lateinit 来告知稍后初始化,但却提示不能用于基本数据类型,后来查了相关资料,确实不能这么用,注意 lateinit 不能用于基本数据类型
还有一点和 Java 不同,Java 里一个 long 型变量可以赋值 int 值,而 Kotlin 里需要显示要求必须为 Long 型值。也就是说 Kotlin 里要求显示转换数字,var longNum: Long = 123L 才正确,var longNum: Long = 123 就是错误的。
Any 和 Any?
Any 对应到 Java 里就是 Object,即所有非空类的超类。那么 Any? 对应到的就是 Object 及 null。在 Kotlin 里只要是 Any 的子类,都有 toString, equals, hashCode 方法。
Unit 和 Nothing
这两个类型,前者很常用,后者不常用。前者虽说常用,但其实我们开发者用的并不多。Unit 对应的是 Java 里的 void,表示函数没有返回。但它其实也是返回类型,只不过可以隐式表达(即函数不写返回值时,默认就是返回它)。
在实际使用上来讲,只要知道它也是一种类型,能表示函数不需要返回值的情况。
至于名字的来源有两点原因,1.在函数式编程中的惯用表达,Unit 表示只有一个实例,2.如果用 Void 会很 Nothing 产生混淆。基于这两点选用了 Unit。
Nothing 类型比较特殊,用作函数返回类型时表示函数不能正常结束,要么抛异常,要么无限循环等情况。它的含义是没有任何值,也可作为类型参数用于泛型。
网友评论