Kotlin基础(五)Kotlin的类型系统
Kotlin的类型系统
一、可空类型
//s为null的话编译器会报错,没问号不能为空
fun strLen(s : String)=s.length
//如果允许s为空可:
fun strLen2(s : String?) : Int{
if (s!=null) return s.length
else return 0
}
/*
注意可空类型和不可空类型只是在编译期做的
检查不同,runtime这两者并无区别
*/ //"?."的用法
fun strLen3(s : String?) :Int?=s?.length
//相当于
fun strLen4(s : String?) :Int?{
//如果是为null则返回null,不为null就返回"."后面的调用结果
if (s!=null) return s.length
else return null
} //"?:"的用法
fun foo(s: String?){
//如果为null,则s="",s不为null其值为自身不变
val t: String=s ?: ""
}
//结合使用
fun strLenSafe(s: String?) :Int=s?.length?:0 //"as?"的用法:尝试将一个值转换为指定类型,转换不成功则返回null
class Person(val firstName: String, val lastName: String) {
override fun equals(o: Any?): Boolean {
val otherPerson = o as? Person ?: return false
return otherPerson.firstName == firstName &&
otherPerson.lastName == lastName
}
override fun hashCode(): Int =
firstName.hashCode() * 37 + lastName.hashCode()
} //非空判断"!!"用法
fun ignoreNulls(s:String?) {
val sNotNull: String=s!!
//do sth
}
/**
* let函数:把一个调用它的对象变换为lambda表达式的参数
* */ fun sendEmail(address: String)= println("Send an email to $address") fun main(args: Array<String>) {
//复杂的做法
val address: String?="tang@163.com"
if (address!=null) sendEmail(address)
//使用let函数简化代码
address?.let(::sendEmail)
}
class Girle {
//lateinit修饰符,延迟初始化,但不能延迟基础类型
private lateinit var age : Secrit
}
class Secrit
类型参数的可空性:在Kotlin中所有泛型类和泛型函数的类型参数默认都是可空的,要使类型参数非空,必须为它指定一个非空的上界。
fun <T: Any> printHashCode(t: T){
println(t.hashCode())
}
二、基本数据类型和其他基本类型
1.Kotlin表面上并不区分基本类型和其包装类型,但实际上基本类型,如数字类型尽可能地被高效地使用
所以大多数情况下它们会被编译为基本类型,唯一不可行的是泛型类。
2.在Kotlin中使用Java时,Java的基本类型一定会被编译为非空类型,而不是平台类型。
3.任何时候只要使用了基本类型的可空版本,它们就会变为包装类型。
4.Any:所有非空类型(包括基本类型)的超类。把基本数据类型赋值给Any时会自动装箱。Any只能使用Java中equals,toString,hashCode方法,其他方法并不能使用。
5.Unit:Kotlin中的“void”
interface Pro<T>{
fun p() : T
}
/*
* 与Java中的void不同的是Unit是一个完备的类型
* 可以作为类型参数,而void却不行。
* */
class NoResultPro : Pro<Unit>{
//当使用泛型时,Unit表示没有值
override fun p() {
//do sth
}
}
6.Nothing类型:表示这个函数永远不会返回。
fun fail(msg: String): Nothing{
throw IllegalStateException(msg)
}
三、集合与数组
1.可空性和集合:Kotlin完全支持类型参数的可空性。
2.只读集合和可变集合:Kotlin的集合设计和Java不同的是,把访问集合数据的接口和修改集合的数据接口分开了。
但要注意:只读集合并不是不变的,并不是线程安全的。因为,只读集合可能只是同一个集合众多引用中的一个。
fun <T> copyEle(source: Collection<T>,target: MutableCollection<T>){
for (item in source) target.add(item)
}
3.Kotlin集合和Java集合:可变接口直接对应Java中的集合接口,只读版本缺少了所有产生改变的方法。
4.作为平台类型的集合:向Java方法传递可读集合没有用(Java可以修改它)
5.Kotlin中的一个数组是一个带有类型参数的类,创建数组的方法:
fun main(args: Array<String>) {
//arryof创建数组
val ar=arrayOf("one","tow","three","four")
//arryOfNulls创建一个给定大小的数组,包含的是null元素
val s = arrayOfNulls<String?>(8)
//Array构造方法接收数组的大小和一个lambda表达式(用来创建每一个元素)
Array<String>(22) {m -> ("b"+m)}
}
基本类型数组:
fun main(args: Array<String>) {
val s=IntArray(3)
val m= intArrayOf(1,2,3,4)
val h=IntArray(5){i -> i*8}
}
Kotlin基础(五)Kotlin的类型系统的更多相关文章
- Kotlin基础篇(一)
写在前面: 因为工作需要,目前转安卓开发,用的IDE是AS3.2版本,语言的话,用的是Kotlin.由于之前是做.NET的,没接触过这方面的东西,所以完全是小白一枚.所以想着开个博客,以此来记录自己的 ...
- Kotlin基础学习
Kotlin 和 java 都是一种静态类型的编程语言.表达式的类型在编译期已经确定,编译期能验证对象是否包含想访问方法或是字段,维护正确性与性能的同时保持源代码的简洁 静态类型的 ...
- Kotlin Reference (五) Packages
most from reference 包 源文件可以从包声明开始: package foo.bar fun baz() {} class Goo {} // ... 源文件的所有内容(如类和函数)都 ...
- 【Kotlin】初识Kotlin之面向对象
[Kotlin]初识Kotlin之面向对象 1.类 在Kotlin中,类用关键字class来定义 如果一个类具有类体,那么需要使用{ }来写类体内容,如果不需要类体,那么只需要定义类名就可以了 // ...
- Bootstrap <基础五>表格
Bootstrap 提供了一个清晰的创建表格的布局.下表列出了 Bootstrap 支持的一些表格元素: 标签 描述 <table> 为表格添加基础样式. <thead> 表格 ...
- C#_02.14_基础五_.NET类
C#_02.14_基础五_.NET类 一.类实例: 我们前面说过类是一个模板,我们通过类创建一个又一个的实例,通常情况下类当中的变量是每一个实例都各有一份的,互相不影响,而静态字段是除外的,静态字段是 ...
- day 70 Django基础五之django模型层(二)多表操作
Django基础五之django模型层(二)多表操作 本节目录 一 创建模型 二 添加表记录 三 基于对象的跨表查询 四 基于双下划线的跨表查询 五 聚合查询.分组查询.F查询和Q查询 六 ORM ...
- day 69 Django基础五之django模型层(一)单表操作
Django基础五之django模型层(一)单表操作 本节目录 一 ORM简介 二 单表操作 三 章节作业 四 xxx 一 ORM简介 MVC或者MVC框架中包括一个重要的部分,就是ORM,它实现 ...
- day 57 Django基础五之django模型层之关联管理器
Django基础五之django模型层之关联管理器 class RelatedManager "关联管理器"是在一对多或者多对多的关联上下文中使用的管理器.它存在于下面两种情况 ...
- day 56 Django基础五之django模型层(二)多表操作
Django基础五之django模型层(二)多表操作 本节目录 一 创建模型 二 添加表记录 三 基于对象的跨表查询 四 基于双下划线的跨表查询 五 聚合查询.分组查询.F查询和Q查询 六 ORM ...
随机推荐
- Nginx详解三:Nginx基础篇之yum安装
Nginx快速搭建 Mainline version ----开发版:具有最新功能的版本,用于测试.研究.学习,不用于企业生成环境 Stable version----稳定版:官方认可,且通过测试的 ...
- go包之logrus显示日志文件与行号
前言: logrus是go中比较好的一个log模块.github上的很多开源项目都在使用这个模块, 我在写这个博文时, github上的logrus的stars数已经有8214了.最近在用这个模块时, ...
- js中的“==”和“===”的区别
简单来说: == 代表相同, ===代表严格相同, 为啥这么说呢, 这么理解: 当进行双等号比较时候: 先检查两个操作数数据类型,如果相同, 则进行===比较, 如果不同, 则愿意为你进行一次类型转换 ...
- spring cloud Hystix熔断机制--基本熔断配置和Fegin client熔断配置
所谓的熔断机制和日常生活中见到电路保险丝是非常相似的,当出现了问题之后,保险丝会自动烧断,以保护我们的电器, 那么如果换到了程序之中呢? 当现在服务的提供方出现了问题之后整个的程序将出现错误的信息显示 ...
- shell 处理文件脚本
[root@centos-6 ~]# cat info_file.txt lys:28:shanxi zhy:28:shanxi [root@centos-6 ~]# cat info_file2.t ...
- 华硕X75VB安装ubuntu12.10网卡不可用等相关问题总结
笔记本相关信息: 电脑型号:华硕X75VB 笔记本电脑 处理器:i5-3230M 2.60GHz 双核 主板:华硕X75VB (英特尔 Ivy Bridge - HM76 Express芯片组) 内存 ...
- Centos+Redis 集群
Redis 3.2.6集群搭建 Redis3.0版本之后支持Cluster. 1.1.redis cluster的现状 目前redis支持的cluster特性: 1):节点自动发现 2):slave- ...
- [转] React 中组件间通信的几种方式
在使用 React 的过程中,不可避免的需要组件间进行消息传递(通信),组件间通信大体有下面几种情况: 父组件向子组件通信 子组件向父组件通信 跨级组件之间通信 非嵌套组件间通信 下面依次说下这几种通 ...
- virtualenv and virtualenvwrapper
virtualenv 1.下载virtualenv工具 通过物理环境的pip工具安装 清华 国内 pip3 install -i https://pypi.tuna.tsinghua.edu.cn/ ...
- 【转载】DDD分层架构的三种模式
引言 在讨论DDD分层架构的模式之前,我们先一起回顾一下DDD和分层架构的相关知识. DDD DDD(Domain Driven Design,领域驱动设计)作为一种软件开发方法,它可以帮助我们设计高 ...