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的类型系统的更多相关文章

  1. Kotlin基础篇(一)

    写在前面: 因为工作需要,目前转安卓开发,用的IDE是AS3.2版本,语言的话,用的是Kotlin.由于之前是做.NET的,没接触过这方面的东西,所以完全是小白一枚.所以想着开个博客,以此来记录自己的 ...

  2. Kotlin基础学习

        Kotlin 和 java 都是一种静态类型的编程语言.表达式的类型在编译期已经确定,编译期能验证对象是否包含想访问方法或是字段,维护正确性与性能的同时保持源代码的简洁       静态类型的 ...

  3. Kotlin Reference (五) Packages

    most from reference 包 源文件可以从包声明开始: package foo.bar fun baz() {} class Goo {} // ... 源文件的所有内容(如类和函数)都 ...

  4. 【Kotlin】初识Kotlin之面向对象

    [Kotlin]初识Kotlin之面向对象 1.类 在Kotlin中,类用关键字class来定义 如果一个类具有类体,那么需要使用{ }来写类体内容,如果不需要类体,那么只需要定义类名就可以了 // ...

  5. Bootstrap <基础五>表格

    Bootstrap 提供了一个清晰的创建表格的布局.下表列出了 Bootstrap 支持的一些表格元素: 标签 描述 <table> 为表格添加基础样式. <thead> 表格 ...

  6. C#_02.14_基础五_.NET类

    C#_02.14_基础五_.NET类 一.类实例: 我们前面说过类是一个模板,我们通过类创建一个又一个的实例,通常情况下类当中的变量是每一个实例都各有一份的,互相不影响,而静态字段是除外的,静态字段是 ...

  7. day 70 Django基础五之django模型层(二)多表操作

    Django基础五之django模型层(二)多表操作   本节目录 一 创建模型 二 添加表记录 三 基于对象的跨表查询 四 基于双下划线的跨表查询 五 聚合查询.分组查询.F查询和Q查询 六 ORM ...

  8. day 69 Django基础五之django模型层(一)单表操作

    Django基础五之django模型层(一)单表操作   本节目录 一 ORM简介 二 单表操作 三 章节作业 四 xxx 一 ORM简介 MVC或者MVC框架中包括一个重要的部分,就是ORM,它实现 ...

  9. day 57 Django基础五之django模型层之关联管理器

    Django基础五之django模型层之关联管理器   class RelatedManager "关联管理器"是在一对多或者多对多的关联上下文中使用的管理器.它存在于下面两种情况 ...

  10. day 56 Django基础五之django模型层(二)多表操作

    Django基础五之django模型层(二)多表操作   本节目录 一 创建模型 二 添加表记录 三 基于对象的跨表查询 四 基于双下划线的跨表查询 五 聚合查询.分组查询.F查询和Q查询 六 ORM ...

随机推荐

  1. h5 video标签的使用

     标签的布置 <video src="1.mp4" poster="1.jpg" id="vid" controls> 你的浏览 ...

  2. python unittest框架装饰器

    要说单元测试和UI自动化之间的是什么样的一个关系,说说我个人的一些心得体会吧,我并没有太多的这方面经验,由于工作本身就用的少,还有就是功能测试点点对于我这种比较懒惰的人来说,比单元测试复杂...思考单 ...

  3. fio 测试磁盘性能

    在磁盘测试中最关心的几个指标分别为: iops(每秒执行的IO次数).bw(带宽,每秒的吞吐量).lat(每次IO操作的延迟). 当每次IO操作的block较小时,如512bytes/4k/8k等,测 ...

  4. web和servlet一样的用法但是有区别

  5. 上手TensorFlow

    tensorflow中softmax_cross_entropy和sparse_softmax_cross_entropy的区别 都是softmax cross entropy损失函数,区别在于lab ...

  6. 使用layer弹出Ueditor实现父子传值

    Layear的代码:     function tankuang() {        layer.open({            type: 2,            title: false ...

  7. google 插件

    鼠标手势    crxMouse Chrome™ Gestures Google翻译 json格式化  JSONView github展开文件夹     Octotree axure 原型  Axur ...

  8. java抽象类详解

    前言 在没讲抽象类之前  我们先来看看 final关键字 final 修饰符 可以修饰 类.属性.方法 修饰类时  表示该类不能被继承   其他特征 跟普通的类一样 修饰 属性时 表示 改属性不能改变 ...

  9. Comparison of several types of convergence

    In functional analysis, several types of convergence are defined, namely, strong convergence for ele ...

  10. NLS_CHARACTERSET和NLS_NCHAR_CHARACTERSET

    The NLS_CHARACTERSET is used for CHAR, VARCHAR2, LONG and CLOB columns;The NLS_NCHAR_CHARACTERSET is ...