这是我参与「第四届青训营 」笔记创作活动的第 1 天。
在这次组队大项目中,我初次了解到了 Kotlin 这门新兴语言。为了能使本项目顺利开展,我也对这门语言进行了一定的学习。接下来我将会写一些我对这门语言的理解。
基本类型
Java
众所周知,Java 的基本类型有int
、long
、short
、boolean
、byte
、float
、double
和char
,而各自的包装类型是Integer
、Long
、Short
、Boolean
、Byte
、Float
、Double
和Character
。
基本类型在很多情况下确实能带来使用上的速度优势,但是同时引出了一个新的问题。当有泛型存在时,不能直接填写基本类型,因为基本类型不算类,所以无法最后类型擦除成Object
类。这时候包装类应运而生。两种类型都会有自己各自的用处。
基本类型都会有它的一个默认值,如果你不赋值,它就会是那个默认值,而不是null
。如果你需要一个有null
的基本类型,那就需要包装类的辅助了。
int a; // 默认为0
int a = null; // 报错
Integer a = null; // 允许
Kotlin
Kotlin 深化了面向对象这个主旨,万物皆对象。所以,对于 Kotlin 来说,基本类型也是对象。它的基本类型分别有:Int
、Long
、Short
、Boolean
、Byte
、Float
、Double
和Char
。它们的超类都是Any
,也就是 Java 的Object
。除此之外,还有UInt
、Ulong
等无符号基本类型,可以说是对 Java 的延伸。
如果是第一次上手 Kotlin,很多人看这样改后操作很方便,会写出这样的代码:
var a: Int = 1 // 正确
var a: Int = null // 错误
第一个是正确的,虽然看起来像一个包装类而不是基本类型,但是在 JVM 中,它确实给你优化成了 Java 的int
类型。而第二个不对,这在很多使用过 Java 的人来说是很奇怪的,他明明是是个实打实的类,为什么不能给它null
?
这就要提到 Kotlin 对于空类型的解决方式了。你只要往Int
后加一个问号,就不会报错了。
var a: Int? = null
因为 Java 对于参数是否需要空的判断模糊,如果不加注解,很难辨别它到底需要非空还是可空参数。这在基本类型里还可以勉强避免。但如果是类似String
类,就会出现很多空指针问题。所以 Kotlin 约定,只要类后面不加?
,它必须为非null
,反之亦然。
所以可以知道,Int
等于 Java 的int
或 Java 下泛型所需的Integer
(不过不能为null
),Int?
等于 Java 的Integer
。
总结
相比 Java,Kotlin 明显有更大的灵活性。值得 Android 开发者进行深入学习。