首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Kotlin中的类型

Kotlin为了解决这个问题,引进了类型,将运行时可能发生异常提前到编译期发现。 Kotlin中有类型,这种类型表示取值可能为;而一般类型,则取值不能为。区别是类型后面有一个?...,表示这个类型是的。 举个栗子: var s?...=null var s="Hello World" var s=null //编译器提示错误,因为s1是不可的类型 为了应对的判断,Kotlin提供了几种操作符。...length } 因为你自己确保了这个类型不为,那么如果为,那不好意思了,你就会碰到指针异常了,Exception in thread "main" kotlin.KotlinNullPointerException...所以说,Kotlin中虽然有了类型,但也不是就没有空指针异常哦。

1.5K31

Kotlin安全 ① ( Kotlin安全机制 | 变量空性 | 默认变量不可赋值 | 声明类型变量 )

文章目录 一、Kotlin安全机制 二、变量空性 1、默认变量不可赋值 2、声明类型变量 一、Kotlin安全机制 ---- Java 中的指针问题 : 在 Java 语言...: 在 Kotlin 语言 中 , 针对 指针异常 问题 进行了优化 , 引入了 安全机制 , 在代码编写后的 编译期 , 就可以 提前排查出可能出现的指针异常问题 , 并提前进行处理 , 这样极大地提高了...Kotlin 程序的 代码健壮性 ; 二、变量空性 ---- 1、默认变量不可赋值 在 Java 中 , 引用类型的变量 默认为 null 值 ; 但是在 Kotlin 中 , 变量默认不可为...赋值一个值 , 除非 将该变量声明为 类型 ; 2、声明类型变量 声明类型变量 : 如果要声明一个 类型的变量 , 必须 声明该变量的具体的类型 , 并在该类型后添加 ?...类型声明后 , 在 IntelliJ IDEA 中 , 就不再进行报错了 ;

1.9K20
您找到你想要的搜索结果了吗?
是的
没有找到

第3章 Kotlin 类型与类型系统第3章 Kotlin 类型与类型系统

第3章 Kotlin 类型与类型系统 跟Java、C和C ++ 一样, Kotlin也是“静态类型编程语言”。...Kotlin系统类型分为类型和不可类型。Kotlin中引入了类型,把有可能为null的值单独用类型来表示。这样就在引用与不可引用之间划分出来一条明确的显式的“界线”。...Kotlin类型层次结构如下图所示: ? Kotlin类型层次结构 通过这样显式地使用类型,并在编译期作类型检查,大大降低了出现指针异常的概率。...Kotlin自然也不例外。 在 Java 8中,我们可以使用 Optional 类型来表达的类型。...Kotlin正如很多现代编程语言一样——是安全的。因为我们需要通过一个类型符号 T? 来明确地指定一个对象类型 T 是否能为

2.1K20

Java 8中的Optional 类型与 Kotlin 中的类型Java 8中的Optional 类型与 Kotlin 中的类型Kotlin 中的类型《Kotlin极简教程》正式上架:

Java 8中的Optional 类型与 Kotlin 中的类型 在 Java 8中,我们可以使用 Optional 类型来表达的类型。...Kotlin 中的类型 上面 Java 8的例子,用 Kotlin 来写就显得更加简单优雅了: package com.easy.kotlin fun main(args: Array<String...还有Java 8 Optional 提供的orElse s.orElse("").length(); 这个东东,在 Kotlin 是最最常见不过的 Elvis 运算符了: s?.length ?...Kotlin 中的明星符号 ?????????????????????????????????????? ?: ?: ?: ?: ?: ?: ?: ?: ?: ?: ?: ?: ?: ?: ?: ?...示例源代码工程Github 地址: https://github.com/EasyKotlin/java_optional_vs_kotlin_nullable_type 非常感谢您亲爱的读者,大家请多支持

2.6K10

Kotlin安全总结 ( 变量空性 | 手动安全管理 | 安全调用操作符 | 非断言操作符 | 合并操作符 | 指针异常处理 | 先决条件函数判 )

文章目录 一、Kotlin安全机制 二、变量空性 1、默认变量不可赋值 2、声明类型变量 三、手动安全管理 四、安全调用操作符 ?..., 在 Kotlin 中 不允许将 默认变量 赋值一个值 , 除非 将该变量声明为 类型 ; 2、声明类型变量 声明类型变量 : 如果要声明一个 类型的变量 , 必须 声明该变量的具体的类型...类型声明后 , 在 IntelliJ IDEA 中 , 就不再进行报错了 ; 三、手动安全管理 ---- Kotlin 语言中 , 变量类型 分为 类型 和 非类型 , 默认状态 下 ,...四、安全调用操作符 ? ---- 在 Kotlin 语言中 , 调用 类型变量 的 成员 时 , 可以使用 " 安全调用操作符 " 也就是 ? 进行调用 , 使用格式如下 : 类型变量?....---- Kotlin 中的 类型 变量 , 在运行时 可以选择 不启用 安全调用 操作 , 在调用 类型 变量 成员 与 方法 时 , 使用 非断言操作符 !!

1.7K10

Kotlin】变量简介 ( 类型 | lateinit | 初始化判定 | 非类型 | !! 与 ? 修饰符 | ?= ?. ?: 运算符 | 抽象属性变量)

Kotlin 变量 VII . !! 与 ? 修饰符 VIII . ?= 与 ?. 与 ?: 运算符 IX . 抽象属性变量 I ....Kotlin 变量分类 : Kotlin 中的变量分为两种 , 非变量 和 变量 , 其中非变量是困扰广大 Java 开发者的一大难题 , 因为 Java 中没有非变量这个概念 , Kotlin...等操作 , Java 中的所有变量都是的 ; 2 . Kotlin 变量的默认状态 : Kotlin 中变量默认是非变量 , 默认状态下 , Kotlin 必须进行初始化 ; 3 ....Kotlin 变量 ---- Kotlin 中的变量 , 与 Java 变量性质相同 , 所有的 Java 变量都是变量 ; 1 ....Kotlin 变量初始化 : Kotlin 中的变量是必须进行初始化的 , 变量 与 非变量要求不一样 , 但是原则上都必须初始化 ; ① 非变量 : 非变量可以使用 lateinit 修饰

2.4K20

Kotlin 类和对象介绍

实例1: //创建了值传递的主构造器 class Demo3(){ //子构造器就必须加上 this() constructor(name:String):this(){ }...https://zinyan.com/" temp.height=170; temp.name="Z同学" } 上面都是关于非的属性定义....如果我们要初始化时定义属性值那么该如何处理? Kotlin提供了一种可以延迟初始化的方案,使用lateinit 关键字来描述属性....只是Kotlin必须使用object关键字而已 修饰符 介绍:类的修饰符主要分为两个种类,一种是类属性修饰符(classModifier),一种是访问权限修饰符(accessModifier) 类属性修饰符...protected 保护,在同一个类或者子类之中访问 public 公共,全部地方都可访问 internal 内部,在同一个模块下访问 Kotlin的关键字其实和java之中有很多的相识之处.特别是权限访问修饰符

18330

浅谈Kotlin(六):lateinit、by lazy 使用

Kotlin中有两种延迟初始化的方式。一种是lateinit var,一种是by lazy。...一、lateinit的使用 按Java的写法,此时即代表datas默认为null,但是因为Kotlin的非机制,这里给出了两种选择,要不给一个初始值,要不增加lateInit修饰 则可以这么写:...=null 改写法需要在后面使用的时候进行非判断: datas?.size 否则编译不通过,提示: Only safe (?.) or non-null asserted (!!.)...property datas has not been initialized lateinit使用限制: 只能用来修饰类属性,不能用来修饰局部变量, 只能用来修饰对象,不能用来修饰基本类型(因为基本类型的属性在类加载后的准备阶段都会被初始化为默认值...可以使用于类属性或者局部变量。

2.7K32

Kotlin开发中的一些Tips

2.对于对象,使用let比较方便。对于非对象可以使用with。 3.apply和also也非常相似,文档给出的建议是如果是对象配置操作使用apply,额外的处理使用also。...map 和 filter 这类属于中间操作,返回的是一个新Sequence,里面有数据迭代时的实际处理。而 toList和first这类属于末端操作用来返回结果。...只能说kotlin借助语言简洁的优势,让操作线程变的更加简单。 之所以上面说JVM,是因为kotlin还有js和native平台。对于它们来说,或许可以实现真正的协程。...fun test(str: String) { println(str) } 反编译:  [1240]  比如图中的checkParameterIsNotNull就是用了检查参数是否为。...虽然我们的参数是不可控的,但是考虑到方法会被Java调用,Kotlin会默认的增加checkParameterIsNotNull校验。如果kotlin方法是私有的,也就不会有此行检查。

52720

Kotlin:关键字之lateinit

Kotlin中定义变量或者属性都是需要初始化值的,并且其都是private的,但是有些时候对于变量或者属性只需要声明,但是不需要初始化,则kotlin提供了lateinit关键字来实现: class...因此,仅对象类型的属性支持 lateinit 但是 lateinit 是一个坑,对于新手来说还是一个不小的坑 在 Kotlin 代码中慎用 lateinit 属性 这位作者解释的很清楚了 对于 Kotlin...新手来说,应该抛开 Java 式的写法,牢记类属性的三种初始化方式: 主构造函数内定义属性,使用传入的参数初始化属性; 类体内定义属性,同时初始化; 类体内定义属性,init 块里初始化。...最后再提一下Kotlin lateinit 和 by lazy 的区别: 1.lazy{} 只能用在val类型, lateinit 只能用在var类型 如 : val name: String by...lazy { “sherlbon” } lateinit var adapter: MyAdapter12 2.lateinit不能用在的属性上和java的基本类型上 如: lateinit

89920

Kotlin开发中的一些Tips

2.对于对象,使用let比较方便。对于非对象可以使用with。 3.apply和also也非常相似,文档给出的建议是如果是对象配置操作使用apply,额外的处理使用also。...map 和 filter 这类属于中间操作,返回的是一个新Sequence,里面有数据迭代时的实际处理。而 toList和first这类属于末端操作用来返回结果。...只能说kotlin借助语言简洁的优势,让操作线程变的更加简单。 之所以上面说JVM,是因为kotlin还有js和native平台。对于它们来说,或许可以实现真正的协程。...fun test(str: String) { println(str) } 反编译: Kotlin开发中的一些Tips 比如图中的checkParameterIsNotNull就是用了检查参数是否为...虽然我们的参数是不可控的,但是考虑到方法会被Java调用,Kotlin会默认的增加checkParameterIsNotNull校验。如果kotlin方法是私有的,也就不会有此行检查。

53820

减少崩溃,提升体验 | 使用 Kotlin 打造优质应用

比如 Kotlin安全性就让点评的 Android 应用团队赞不绝口,而且团队开发者还可以通过在 Java 代码中使用 @Nullable 和 @NonNull 等注解来确保 Kotlin 代码获得正确的空性推断...整体上看,Kotlin安全特性帮助点评 Android 应用将指针导致的崩溃从日均 3 个降低至 0。...避免 NullPointerException NullPointerException (指针异常) 是 Google Play 上崩溃的第一大原因。...2017 年,中国电信营业厅应用团队就开始使用 Kotlin,现在他们的新项目大约有 50% 的代码都是 Kotlin 编写。团队成功将指针异常的出现概率 降低了 80% 之多。...当处理仅用于保存数据的类时,请使用 Kotlin 数据类。通过数据类,hashCode() 和 equals() 将由编译器生成,会在您更改类属性后自动更新。

1.4K10

【翻译】Kotlin致简代码之路

辛运的是, Kotlin 有着强大的处理 null 指针的能力。让我们一起来看看吧。 类型和非类型 这个 null 安全体系也是 Kotlin 的另一个杀手级特性。...其次,我们可以将一个类型标记为类型( 可以取值 null )或者非类型(不能为 null )。一个类型相对于它所对应的非类型提供了不同的方法,这都是编译器能检测到的。...不可以把变量赋值给非变量 要把一个变量值赋值给非值变量我们必须做一个 null 检测: val value: String = if (nullableValue == null) "default...然而,这个链条中每个元素都有可能是值,因此都是类型。所以,下面的代码是不能通过编译的: val city = order.customer.address.city // 编译错误!...那么我们该怎么做呢?有几个选择。选择 1 是使用非断言申明符 !! 。 val city = order!!.customer!!.address!!.city // 避免这种情况!

1.4K30

Kotlin】扩展函数 ② ( 扩展属性 | 为类型定义扩展函数 | 使用 infix 关键字修饰单个参数扩展函数的简略写法 )

文章目录 一、扩展属性 二、类扩展 三、使用 infix 关键字修饰单个参数扩展函数的简略写法 一、扩展属性 ---- 上一篇博客 【Kotlin】扩展函数 ( 扩展函数简介 | 为 Any 超类定义扩展函数...---- 之前讲的定义扩展函数 , 扩展属性 , 都是为 非类型 定义的 , 如果要为 类型 定义扩展函数 , 则需要在 扩展函数 中 处理时 , 要多考虑一层 接收者 this 为 的 情况...; 注意下面的调用细节 : 如果定义的 扩展函数 是 为 非类型定义的 , 类型变量 想要调用该 扩展函数 , 在调用时使用 " ?...." 进行调用即可 ; 类型实例对象?....非类型扩展函数 如果定义的 扩展函数 是为 类型定义的 , 类型变量 想要调用该 扩展函数 , 在调用时直接使用 " . " 进行调用即可 ; 类型实例对象.类型扩展函数 代码示例

1.9K30

kotlin基础--类定义、初始化、继承

上次介绍了kotlin中的集合List、Set、Map的操作,接下来介绍kotlin中如何定义类、初始化、继承 一、类的定义 1.field 对于每个属性,kotlin会自动生成一个的field:代表属性的值...我们操作属性时,实际调用的是get和set方法,因为kotlin变量的不可空性,对于非变量,我们在赋值时,系统要对赋值的值进行是否为null判断 class Human { var name:...= null val age //年龄为随机数 get() = (1..100).shuffled().first() } 3.防范竞态条件 和变量一样,如果属性...,那么使用它的时候必须保证它非 class Human2 { var name: String?...= _name var age = _age } 2.在主构造函数定义属性 kotlin允许直接用一个定义,同时指定类属性和参数 class Human4( _name: String,

60810

Kotlin Android】一个列表带你领略Kotlin简洁之风

fun fun1() { ... } ... } 如果类没有具体内部变量和方法,那么也可定义为一个类,不需要类名后面的类体 [类属性] class A Kotlin的类默认带有一个无参数的构造函数...,默认可以省略不写,如果类的构造函数带有参数,那么你直接写在默认的构造函数上,或者另外写一个二级构造函数 class A(var arg1: Int, val arg2: String) 或 class...在Java中经常出现让人头痛的问题就是,如果不加null判断,常常会出现指针异常,而在Kotlin中,必须对可能为的变量进行显式的声明,即 i)在变量后面加上“?”...来表示该变量可能为,如果变量真的为null时,会跳过不执行。 ii)如果想和Java一样,在变量为null时,抛出指针异常,那么可以在变量后加上“!!”...双感叹号,对变量进行声明,即该变量一定不为

1.8K10

Kotlin 负责人:我们是如何一步步设计 Kotlin 的?

1Kotlin 安全的故事 以 Kotlin 安全(null-safety)为例。...然而,随着这种具有非类型的直接设计开始用于实际代码,它很快就开始与 Kotlin 语言设计的另一个目标(与 Java 的无缝互操作性)产生了冲突。...灵活类型背后的基本思想是,为了与 Java 等类型不是那么严格的语言进行互操作时,我们不使用更宽泛的类型,例如 String?...递归泛型的难题在于 Kotlin 没有明确的语法来指定这样的递归类型以使代码编译。因此,我们有多种选择。最热门的选择之一是使用一种特殊语法,告诉编译器推断类型参数的上限。...目前,Kotlin 团队正在进行一项大规模的工程项目,即重写整个 Kotlin 编译器。编译器的架构正在重新设计,以提高性能和未来的扩展性。

1.2K20

JetBrains首席语言设计师:我们将如何让Kotlin再活几十年

Kotlin 安全的故事 以 Kotlin 安全(null-safety)为例。...然而,随着这种具有非类型的直接设计开始用于实际代码,它很快就开始与 Kotlin 语言设计的另一个目标(与 Java 的无缝互操作性)产生了冲突。...灵活类型背后的基本思想是,为了与 Java 等类型不是那么严格的语言进行互操作时,我们不使用更宽泛的类型,例如 String?...递归泛型的难题在于 Kotlin 没有明确的语法来指定这样的递归类型来编译代码。因此,我们有多种选择。最热门的选择之一是使用一种特殊语法,告诉编译器推断类型参数的上限。...目前,Kotlin 团队正在进行一项大规模的工程项目,即重写整个 Kotlin 编译器。编译器的架构正在重新设计,以提高性能和未来的扩展性。

1.5K10

Kotlin 1.4 新特性预览

关键词:Kotlin 1.4 新版本 Kotlin 1.4 没有特别重大的更新,更多的是细节的优化。 ? 1....= null){ println(x.length) } } 我明明已经判断了 x 不为,为什么却不能自动推导成 String?...这里还有一个细节,如果一个类当中同时存在用到和没用到 KProperty 对象的两类属性代理,那么生成的数组在 1.4 当中只包含用到的 KProperty 对象,例如: class MyOtherClass...2.10 尾递归函数的优化 尾递归函数估计大家用的不多,这里主要有两个优化点 尾递归函数的默认参数的初始化顺序改为从左向右: 尾递归函数不能声明为 open 的,即不能被子类覆写,因为尾递归函数的形式有明确的要求...图 11:1.4 中尾递归函数的默认参数列表初始化顺序 2.11 契约的支持 从 1.3 开始,Kotlin 引入了一个实验特性契约(Contract),主要来应对一些“显而易见”情况下的类型推导或者智能类型转换

94110
领券