Kotlin基本类型

原文地址

Basic Types

在Kotlin中,在通过变量调用成员函数和属性的意义上来讲,任何东西都是对象。一些类型是嵌入的,由于他们的实现被优化了,但是对于用户他们看起来像普通的类。在本章中我们描述多数这种类型:如数字、字符、布尔和数组。

数字:

Kotlin处理数字的方式接近java,但不完全相同。例如,这儿没有对数字隐性扩展转换,并且字面值在某些情况下也不一样。

Kotlin提供如下嵌入类型代表数字(很像java)
Type Bit width
Double 64
Float 32
Long 64
Int 32
Short 16
Byte 8

注意在Kotlin中字符不是数字

Literal Constants(字面常量)

下面是几种字面常量对于整数:
  • 十进制:123
  • 被大写字母L标记的长整形:123L
  • 16进制:0x0F
  • 二进制:0b00001011

注意:8进制字面值是不支持的。

Kotlin也支持常规的符号对于浮点型:
  • Doubles by default(默认Double型): 123.5, 123.5e10
  • Floats 被标记为f或者F:123.5f

Underscores in numeric literals (since 1.1)(数字中的下划线)

为了让数字常量更易阅读,你能够使用下划线

val oneMillion = 1_000_000
val creditCardNumber = 1234_5678_9012_3456L
val socialSecurityNumber = 999_99_9999L
val hexBytes = 0xFF_EC_DE_5E
val bytes = 0b11010010_01101001_10010100_10010010

Representation

在Java平台中,数字被存为JVM原始类型,除非我们需要一个可空的数字引用(也就是Int?)或者涉及到泛型时。下面的情况当中数字是被装箱的。
注意,装箱的数字不保留一致性

val a: Int = 10000
print(a === a) // Prints 'true'
val boxedA: Int? = a
val anotherBoxedA: Int? = a
print(boxedA === anotherBoxedA) // !!!Prints 'false'!!!

在另一方面,它保留相等性

val a: Int = 10000
print(a == a) // Prints 'true'
val boxedA: Int? = a
val anotherBoxedA: Int? = a
print(boxedA == anotherBoxedA) // Prints 'true'

Explicit Conversions(显示转换)

由于不同表示,较小的类型不是较大类型的子类型。如果他们是,我们将在一些情况下有一些问题:

//假定代码,并不实际编译:
val a: Int? = 1 // A boxed Int (java.lang.Integer)
val b: Long? = a // implicit conversion yields a boxed Long (java.lang.Long)
print(a == b) // Surprise! This prints "false" as Long's equals() check for other part to be Long as well

所以不仅一致性,甚至相等性也将会消失。
结果是,较小的类型不会隐式转换为较大的类型。我们不能把一个Byte的值赋给一个Int变量在没有明确的转换的情况下。

val b: Byte = 1 // 成功,字面值被静态的检查
val i: Int = b // ERROR

我们可以使用显示转换去扩大的数字

val i: Int = b.toInt() // OK: explicitly widened

每个数字类型支持如下转换:
• oByte(): Byte
• toShort(): Short
• toInt(): Int
• toLong(): Long
• toFloat(): Float
• toDouble(): Double
• toChar(): Char

隐式转换的缺失很少被注意到因为上下文中的类型推断,和算术操作符被重载为合适的转换,例如:

val l = 1L + 3 // Long + Int => Long

Operations

Kotlin支持被声明为类成员的数字运算的标准集。(但是编译器优化了相关的调用指令),参看操作符重载
作为位运算,这里没有特殊的字符,但是只有能够以前缀方式调用的命名函数,例如:

val x = (1 shl 2) and 0x000FF000

这儿有完整的未操作符(仅仅适用于整型和长整型)
• 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

字符

字符被Char类型表示,他们不能直接被当做数字

fun check(c: Char) {
    if (c == 1) { // ERROR: incompatible types
        // ...
    }
}

字符文字在单引号中’1’.特殊字符能够被转义用反斜杠。如下转义结果被支持:\t, \b, \n, \r, ', ", \ and $.为了编码其他任何字符,适用Unicode转义语法:'\uFF00'
我们可以明确的把一个字符转为一个整型:

fun decimalDigitValue(c: Char): Int {
    if (c !in '0'..'9')
        throw IllegalArgumentException("Out of range")
    return c.toInt() - '0'.toInt() // Explicit conversions to numbers
}

像数字那样,字符被装箱当可空引用类型需要的时候。通过装箱操作,一致性将不被保留。

布尔类型

Boolean类型代表布尔类型,并且有两个值:true和false。
布尔类型被装箱当一个可空的引用被需要的时候。
嵌入操作当布尔类型包括
• || – lazy disjunction
• && – lazy conjunction
• ! - negation

数组

Arrays 在Kotlin中代表有get和set函数的类(转化为[]通过操作符重载的约定),和size属性,和一些其他有用的成员函数。

class Array<T> private constructor() {
    val size: Int
    operator fun get(index: Int): T
    operator fun set(index: Int, value: T): Unit

    operator fun iterator(): Iterator<T>
    // ...
}

为了创建一个数组,我们可以使用一个库函数arrayof()并且传进一些值进去。所以arrayof(1,2,3)创建一个数组array[1,2,3].相反的,arrayofNulls()库函数可以用于创建一个空数组

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

正如我之上所说的那样,[]操作符代表调用成员函数get()和set();
注意:不像java,kotlin中的arrays是不变的。也就意味kotlin不允许我们分配一个Array<String>到Array<Any>,这阻止了一个运行时异常(但是你可以使用Array<out Any>,参看Type Projections
Kotlin也有一些特殊的类代表没有装箱损耗的原始类型的数组:ByteArray,ShortArray,IntArray等等,这些类没有Array类的相关继承类,但是他们有相同的属性和函数集合。他们中每一个也含有一个相应的工厂函数:

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

字符串

字符串代表类型String。字符串是不可变的。String中的元素是可以被索引操作访问的字符:s[i]。一个字符串可以通过for循环遍历

for (c in str) {
    println(c)
}

String 字面值

Kotlin有两种类型的字符串字面值:转义字符串可能含有转义字符,原始字符串可以包含换行和任意文本。一个转义字符串非常像java字符串。

Val s= “Hello,World!\n”

转义是像传统方式那样完成的,通过反斜杠。参看之上的Characters,支持的转义序列列表

一个原始字符串被一个引用(“””)限定,包含非转义和能够包含换行和其他任意字符串。

val text = """
    for (c in "foo")
        print(c)
"""

你可以移除开头空格通过trimMargin()函数:

val text = """
    |Tell me and I forget.
    |Teach me and I remember.
    |Involve me and I learn.
    |(Benjamin Franklin)
    """.trimMargin()

默认情况下| 用于页边前缀,但是你能够选择另一个字符串并且把它当做参数传入,例如trimMargin(">").

字符串模板

字符串可能包含模板表达式,也就是被评估的代码碎片和结果被嵌入到字符串中。一个模板表达式可以以美元符号开始并且包含一个简单的名称:

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

或者一个在花括号中的任意表达式:

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

模板同时被原始字符串和转义字符串支持。如果你需要表示一个字面值$字符在原始字符串中(不支持反斜杠转义),你可以使用如下语法:

val price = """
${'$'}9.99
"""
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343

推荐阅读更多精彩内容