网页链接:https://kotlinlang.org/docs/reference/basic-types.html
2. 基本概念
2.1. 基本类型
从可以在任何变量处理调用成员函数和属性角度来说,在Kotlin开发语言中,一切都是对象。有些类型是内嵌的,它们的实现进行过优化,用户看到的仍是原始类。在这节中,我们说明大部分这些类型:数字,字符,布尔和数组。
2.1.1. 数字
Kotlin开发语言处理数组的方法类似Java开发语言,但是也有差别。例如,没有隐含的数字扩宽的转换,并且在相同的情况下,文字也有些不同。
Kotlin开发语言提供下列内嵌类型表示数字(这是类似Java开发语言):
类型 |
位宽度 |
Double |
64 |
Float |
32 |
Long |
64 |
Int |
32 |
Short |
16 |
Byte |
8 |
注意,在Kotlin开发语言中,字符不属于数组。
2.1.1.1. 文字常数
对于整数值有下面几种文字常数:
—— 十进制数:123
—— 附加大写字母L标准长整数:123L
—— 十六进制数:0x0F
—— 二进制数:0b00001011
注意:不支持八进制数字。
Kotlin开发语言还支持通用的浮点数表示法:
—— 默认是双精度:123.5,123.5e10
—— 附加f或F表示单精度浮点数:123.5F
2.1.1.2. 表示法
在Java开发语言平台上,数字是作为JVM基本类型进行物理存在的,除非需要一个可null数字引用(如:Int?)或包含在泛型。后一种情况下,是将数字装箱的。
注意数字装箱不保持一致性:
1 val a: Int = 10000
2 print(a === a) // 打印 'true'
3 val boxedA: Int? = a
4 val anotherBoxedA: Int? = a
5 print(boxedA === anotherBoxedA) // !!!打印 'false'!!!
而另一方面,却保持相等:
1 val a: Int = 10000
2 print(a == a) // 打印 'true'
3 val boxedA: Int? = a
4 val anotherBoxedA: Int? = a
5 print(boxedA == anotherBoxedA) // 打印 'true'
2.1.1.3. 显式转换
由于不同的表示法,较小类型不是较大类型的子类型。如果是,就有下列麻烦了:
1 // 假设代码,没有实际编译:
2 val a: Int? = 1 // 装箱为Int (java.lang.Integer)
3 val b: Long? = a // 隐含转换装箱为Long (java.lang.Long)
4 print(a == b) // 令人惊讶! 当equals()检查其它部分不是Long,就打印"false"
所以不仅仅是一致性,而且即使相当也会在此默默丢失一部分。
这样,较小的类型不会隐含的转换为较大的类型。这就是说,如果没有进行明确的类型转换,Byte类型值是不能赋值给Int类型变量。
1 val b: Byte = 1 // OK, 静态文字检查
2 val i: Int = b // 错误
可以进行明确(显式)的数字宽度转换:
1 val i: Int = b.toInt() // OK: 显式宽度转换
每项数字类型支持下列转换:
toByte(): Byte
—toShort(): Short
—toInt(): Int
—toLong(): Long
—toFloat(): Float
—toDouble(): Double
—toChar(): Char
因为类型是从上下文推断,以及适当的转换重载了算术运算符,所以隐式转换缺位是很少引人注目的,例如:
1 val l = 1L + 3 // Long + Int => Long
2.1.1.4. 运算
Kotlin开发语言支持对数字标准的一套运算,它们被声明为相应类成员(但是,编译器优化调用的相应指令)。查看:运算符重载(5.6)。
作为位运算,对于它们没有特殊特性(字符),仅仅命名函数使其能以中缀方式被调用,如:
1 val x = (1 shl 2) and 0x000FF000
这是完整的位运算列表(仅仅对Int和Long类型有效):
— shl(bits) – signed shift left (Java’s <<)
— shr(bits) – signed shift right (Java’s >>)
— ushr(bits) – unsigned shift right (Java’s >>>)
— and(bits) – bitwise and
— or(bits) – bitwise or
— xor(bits) – bitwise xor
— inv() – bitwise inversion
2.1.2. 字符
char类型表示字符。它们不能直接作为数组处理:
1 fun check(c: Char) {
2 if (c == 1) { // ERROR: incompatible types
3 // ...
4 }
5 }
字符文字是在单引号中:’1’,’\n’,’\uFF00’。我们能够明确地转换字符到Int数字:
1 fun decimalDigitValue(c: Char): Int {
2 if (c !in '0'..'9')
3 throw IllegalArgumentException("Out of range")
4 return c.toInt() - '0'.toInt() // Explicit conversions to numbers
5 }
在需要可null引用时,像数字、字符是被装箱。装箱操作是不保证一致性的。
2.1.3. 布尔值
Boolean类型表示布尔值,它有两个值:true和false。
如果需要可null引用时,布尔值可以被装箱的。
布尔值的内置的运算包括:
— || – lazy分离 (注:这个“lazy”不知道怎样翻译好,就是 “或”为啥要这样?)
— && – lazy连接
— ! – 非
2.1.4. 数组
在Kotlin开发语言中,Array类表示数组,它有get和set函数(即通过操作符重载约定转成[]),有size属性,以及其他一些有用的成员函数:
1 class Array<T> private constructor() {
2 val size: Int
3 fun get(index: Int): T
4 fun set(index: Int, value: T): Unit
5
6 fun iterator(): Iterator<T>
7 // ...
8 }
可以用库函数arrayOf(),将数组各项的数值传递给它,来创建一个数组,如:arrayOf(1,2,3)创建数组[1,2,3]。或者,用arrayOfNulls()库函数创建一个指定尺寸(size)的数组,其元素均填充为nu