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. Appium Demo

    import unittestimport timefrom appium import webdriverfrom public import configimport os #类继承unittes ...

  2. C++设计模式——观察者模式(转)

    前言 之前做了一个性能测试的项目,就是需要对现在的产品进行性能测试,获得测试数据,然后书写测试报告,并提出合理化的改善意见.项目很简单,我们获得了一系列性能测试数据,对于数据,我们需要在Excel中制 ...

  3. IDEA项目的复制操作

     另一种复制项目的方法 完成

  4. C 语言的 GCC 扩展

    GNU 编译器(GCC)提供了很多 C 语言扩展,编译器会使用该信息生成更高效的机器代码. 内联函数 static inline __attribute__ ((always_inline)) int ...

  5. Morley's Theorem

    题解: 计算几何基本操作 注意叉积的时候字母写的顺序 代码: #include <bits/stdc++.h> using namespace std; #define rint regi ...

  6. 【bzoj1042】[HAOI2008]硬币购物 背包dp+容斥原理

    题解: 计数题 首先考虑容斥 这题很明显加了限制状态就很多 考虑没有限制 显然可以直接dp 然后 我们看一下 容斥 某一个使用>=k张 那么其实就是 f[i-k*c[]] 于是这样就可以做了

  7. groovy中的正则表达式操作符【groovy】

    groovy中对于正则表达式的书写进行了简化,同时引入了新的操作符,使得正则表达式使用起来比较方便简单. 对于书写的改进: 比如 assert "\\d" == /\d/ 也就是在 ...

  8. 在grails中远程调用action

    在进行类似批处理的程序时,如果在一个action中需要保存很多记录数,这会导致grails中的数据库session超过负荷,从而导致OOM. 因为这个情况的发生是由于在一次请求中,对数据进行的修改都保 ...

  9. Javascript转义字符串中的特殊字符处理

    Web应用系统中,客户端发送请求到服务器,请求中的字符串参数,在被序列化成json过程中有些特殊字符会被空格代, 导致传递到服务器端再解析的时候,原本的输入参数就会被改变. 目前遇到的特殊字符有加号( ...

  10. ui-router实现返回上一页功能

    angular.module('ConsoleUIApp', ['ui.router','ui.bootstrap']) .config(function ($stateProvider, $urlR ...