如果你学过Ruby,你一定知道“万物皆对象”。Kotlin中也一样。即便数字(Numbers)在Kotlin中是基本类型,也可以这样写:123.toString()

下面我们来看一下Kotlin中的基本类型。

Numbers

Kotlin提供的数字类型和Java很像:

Type Bitwidth
Double 64
Float 32
Long 64
Int 32
Short 16
Byte 8

值得注意的是,定义Long形要用大写L:123L

而16进制和二进制则和Java一样:0x0F 0b0101

8进制则不支持。

浮点型和Java一样,类似123.45默认为Double类型,想要Float类型则应写成123.45f

在Java平台中,Number是基本类型。如果需要一个可空的数字(比如Int?)或者泛型,数字就会被装箱(boxed):

1
2
3
4
5
6
7
val a: Int = 10000
print(a == a) // Prints 'true'
print(a === a) // Prints 'true'
val boxedA: Int? = a
val anotherBoxedA: Int? = a
print(boxedA == anotherBoxedA) // Prints 'true'
print(boxedA === anotherBoxedA) // !!!Prints 'false'!!!

==相当于调用equals方法。而===相当于Java中的==,用来比较引用对象。

注意在官方的Reference中用的是即将被deprecated的identityEquals,会得到错误的结果,详情参看 http://stackoverflow.com/questions/31666155/kotlins-identityequals-not-working-as-expected

Kotlin中,数字类型不能像Java一样隐式(implicitly)转换类型。

1
2
3
val a:Int? = 1
val b:Long? = a // 这里会编译报错,Int不能转换成Long
print(a == b) // 这里会编译报错,Int和Long不能进行比较

而所有的数字类型都有如下显示方法:

  • toByte()
  • toShort()
  • toInt()
  • toLong()
  • toFloat()
  • toDouble()
  • toChar()

写惯Java的人可能觉得这样会很不方便,但事情也没有那么糟糕。因为运算符可以帮我们隐式的转换数字类型:

1
val l = 1.toLong() + 3 // Long + Int => Long

仅Int和Long可以进行位运算。运算符与Java不同:

  • shl(bits) 有符号的左位移,在Java中是<<
  • shr(bits) 有符号的右位移,在Java中是>>
  • ushr(bits) 无符号的右位移,在Java中是>>>
  • and(bits) 与,在Java中是&
  • or(bits) 或,在Java中是|
  • xor(bits) 异或,在Java中是^
  • inv() 非,在Java中是~

Characters

Int不能直接转为Char,下面的代码会编译报错:

val a:Char = 1

但是Char可以通过toInt()方法转为Int。

同数字一样,如果需要一个可空类型(Char?),那么这个Char会被自动装箱(boxed)。

Booleans

没什么好说的,也是自动装箱的问题。

Arrays

Kotlin中的数组写法与Java区别很大,有专门的Array类来创建和操作数组。

如果我想创建一个[1, 2, 3]数组,可以这样写:

1
2
val a:Array<Int> = arrayOf(1, 2, 3) // 注意这里的数字装箱了
a[0] = a[1] + a[2] // 这里的操作与Java一样

还可以像这样写:

1
2
// Creates an Array<String> with values ["0", "1", "4", "9", "16"]
val asc = Array(5, {i -> (i * i).toString()})

如果想要一个空数组,可以使用arrayOfNulls(size: Int)方法。

如果不想装箱,Kotlin也提供一些原子类型(primitive type)的数组,如IntArrayShortArray等。这些类型没有继承Array类型,但是拥有相同的方法。每个类型都有对应的工厂方法:

1
2
val x: IntArray = intArrayOf(1, 2, 3)
x[0] = x[1] + x[2]

Strings

s.[0]相当于Java中的s.charAt(0)

还可以使用iterator:

1
2
3
for (c in str) {
println(c)
}

Kotlin包含两种类型的字符串:与Java字符串相同的escaped strings和新的raw strings。escaped strings中的换行符是\n,而raw strings就厉害了。看这个例子:

1
2
3
4
val text = """
for (c in "foo")
print(c)
"""

注意第二行和第三行都是字符串,它们被包含在三个引号中。

Kotlin中再也不用写繁琐的String.format了,只需要一个$

1
2
val i = 10
val s = "i = $i" // evaluates to "i = 10"

甚至可以像这样写表达式:

1
2
val s = "abc"
val str = "$s.length is ${s.length}" // evaluates to "abc.length is 3"

这篇是用Typora写的,确实很好用,而且是国人出品!