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. C++11 中的function和bind、lambda用法

    std::function 1. std::bind绑定一个成员函数 #include <iostream> #include <functional> struct Foo ...

  2. SQL Server 常用函数使用方法

    之前就想要把一些 SQL 的常用函数记录下来, 直到今天用到substring()这个函数,C# 里面这个方法起始值是 0,而 SQL 里面起始值是 1.傻傻分不清楚... 这篇博客作为记录 SQL ...

  3. FATAL Fatal error during KafkaServerStable startup. Prepare to shutdown (kafka.server.KafkaServerStartable) java.io.FileNotFoundException: /tmp/kafka-logs/.lock (Permission denied)

    1.启动kafka的时候,报错如下所示: [-- ::,] INFO zookeeper state changed (SyncConnected) (org.I0Itec.zkclient.ZkCl ...

  4. 关于yum网络版仓库(本地yum仓库的安装配置,如果没网了,做一个局域网内的yum仓库)

    2017-11-13 22:49:48 1:两种方式:   a.每一台机器都配一个本地文件系统上的yum仓库 file:///packege/path/ b.在局域网内部配置一台节点(server-b ...

  5. 【转载】Python and Mysql Andy Dustman

    0. http://mysql-python.sourceforge.net/ Python and MySQL: This is a presentation I did a couple year ...

  6. js获取file控件的完整路径(上传图片预览)

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...

  7. 【Android】AndroidManifest 中original-package标签

    Manifest.xml 中   <manifest>标签中package属性用于设置应 用程序的进程名,即在运行时使用ddms查看到的进程名.   <original-packag ...

  8. 解决 Ionic 浏览器跨域问题

    <system.webServer> <httpProtocol> <customHeaders> <add name="Access-Contro ...

  9. bat处理快速安装jdk脚本

  10. net core体系-web应用程序-4asp.net core2.0 项目实战(1)-6项目缓冲方案

    Asp.Net Core2.0下使用memcached缓存. Memcached目前微软暂未支持,暂只支持Redis,由于项目历史原因,先用博客园开源项目EnyimMemcachedCore,后续用到 ...