Kotlin 基本使用之基本类型 | 青训营笔记

72 阅读2分钟

这是我参与「第四届青训营 」笔记创作活动的第 1 天。

在这次组队大项目中,我初次了解到了 Kotlin 这门新兴语言。为了能使本项目顺利开展,我也对这门语言进行了一定的学习。接下来我将会写一些我对这门语言的理解。

基本类型

Java

众所周知,Java 的基本类型有intlongshortbooleanbytefloatdoublechar,而各自的包装类型是IntegerLongShortBooleanByteFloatDoubleCharacter

基本类型在很多情况下确实能带来使用上的速度优势,但是同时引出了一个新的问题。当有泛型存在时,不能直接填写基本类型,因为基本类型不算类,所以无法最后类型擦除成Object类。这时候包装类应运而生。两种类型都会有自己各自的用处。

基本类型都会有它的一个默认值,如果你不赋值,它就会是那个默认值,而不是null。如果你需要一个有null的基本类型,那就需要包装类的辅助了。

int a; // 默认为0
int a = null; // 报错
Integer a = null; // 允许

Kotlin

Kotlin 深化了面向对象这个主旨,万物皆对象。所以,对于 Kotlin 来说,基本类型也是对象。它的基本类型分别有:IntLongShortBooleanByteFloatDoubleChar。它们的超类都是Any,也就是 Java 的Object。除此之外,还有UIntUlong等无符号基本类型,可以说是对 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 开发者进行深入学习。