Kotlin数据类型 Unit、Nothing与Nothing?、Any与Any?

 
  • Unit类型
    Kotlin也是面向表达的语言。在Kotlin中所有控制流语句都是表达式(除了变量赋值,异常等)
    Kotlin中Unit类型实现了与java中void一样的功能。
public object Unit {// Unit类型是一个object对象类型
override fun toString() = "kotlin.Unit" // toString函数返回值
}
  • 1
  • 2
  • 3

当一个函数没有返回值的时候,我们用Unit来表示这个特征,而不是null,大多数时候我们不需要显示地返回Unit,或者生命一个函数的返回值是Unit,编译器会推断它。

fun unitExample() {
println("test,Unit")
} @JvmStatic
fun main(args: Array<String>) {
val helloUnit = unitExample()
println(hellUnit)
println(hellUnit is kotlin.Unit)
}

输出结果

可以看出变量helloUnit的类型是kotlin.Unit类型。以下写法是等价的

 fun unitExample():kotlin.Unit {
println("test,Unit")
}
fun unitExample(){
println("test,Unit")
return kotlin.Unit
}
fun unitExample(){
println("test,Unit")
}

跟其他类型一样,Kotlin.Unit的类型是Any。如果是一个可空的Unit?那么父类型是Any?。

  • Nothing与Nothing?
    在java中void不能是变量的类型,也不能作为值打印输出。但是在java中有个包装类Void是void的自动装箱类型。如果你想让一个方法的返回类型永远是null的话,可以把返回类型为这个大写的Void类型。
public Void testV() {//声明类型是Void
System.out.println("am Void");
return null;//返回值只能是null
} public static void main(String[] args) {
JavaTest test = new JavaTest();
Void aVoid = test.testV();
System.out.println(aVoid);
}

打印结果如下

这个Void对应的类型是Nothing?,其唯一可被访问的返回值也是null,Kotlin中类型层次结构最底层就是Nothing
Nothing的类定义如下

//Nothing的构造函数是private的,外界无法创建Nothing对象
public class Nothing private constructor()


如果一个函数返回值是Nothing,那么这个函数永远不会有返回值。
但是我们可以使用Nothing来表达一个从来不存在的返回值。例如EmptyList中的get函数

object EmptyList : List<Nothing> {

        override fun get(index: Int): Nothing {
throw IndexOutOfBoundsException()
}
}

因为get永远不会反回值,而是直接抛出了异常,这个时候可以用Nothing作为get函数的返回值。
再例如Kotlin标准库里面的exitProcess()函数

@kotlin.internal.InlineOnly
public inline fun exitProcess(status: Int): Nothing {
System.exit(status)
throw RuntimeException("System.exit returned normally, while it was supposed to halt JVM.")
}

Unit与Nothing之间的区别是,Unit类型表达式计算结果返回值是Unit;Nothing类型表达式计算结果永远是不会反回的,与java中void相同。
Nothing?可以只包含一个值 null 。

Nothing?唯一允许的值是null,可被用作任何可空类型的空引用。

  • Any?是可空类型的根。Any?是Any的超集,Any?是Kotlin类型层次的最顶端。
		println(1 is Any)
println(1 is Any?)
println(null is Any)
println(1 is Any?)
println(Any() is Any?)

输出如下

true
true
false
true
true

有关Kotlin编程电子书收藏(下载地址

Kotlin数据类型 Unit、Nothing与Nothing?、Any与Any?的更多相关文章

  1. Kotlin 数据类型(数值类型)

    Kotlin 的常见数据类型: 类型 范围 byte -128~127 short 32767-32768 int -2147483648~2147483647 long 92233720368547 ...

  2. Kotlin 数据类型(字符类型)

    Kotlin有两种常见的字符类型. 第一种是String,第二种char. String String 的类型的赋值必须是用双引号的. 格式: var name="Arm830" ...

  3. Kotlin——初级篇(八):关于字符串(String)常用操作汇总

    在前面讲解Kotlin数据类型的时候,提到了字符串类型,当然关于其定义在前面的章节中已经讲解过了.对Kotlin中的数据类型不清楚的同学.请参考Kotlin--初级篇(三):数据类型详解这篇文章. 在 ...

  4. Kotlin——关于字符串(String)常用操作汇总

    在前面讲解Kotlin数据类型的时候,提到了字符串类型,当然关于其定义在前面的章节中已经讲解过了.对Kotlin中的数据类型不清楚的同学.请参考Kotlin——初级篇(三):数据类型详解这篇文章. 在 ...

  5. 1.scala基础语法总结

    Scala基础语法总结:Scala 与 Java 的最大区别是:Scala 语句末尾的分号 ; 是可选的.如果一行里写多个语句那么分号是需要的 val s = "菜鸟教程"; pr ...

  6. spark之scala快速入门

    scala和java都是在jvm之上的语言,相对来讲,scala热度比较低,其实并不是一个特别好的语言选择. 原因倒不是因为scala本身的缺点,而是使用人群不够多,论坛和社区不够活跃.这就跟社交软件 ...

  7. Kotlin入门第三课:数据类型

    前文链接: Kotlin学习第一课:从对比Java开始 Kotlin入门第二课:集合操作 初次尝试用Kotlin实现Android项目 Kotlin的数据类型与Java类似,因此这篇文章主要看Kotl ...

  8. Kotlin——最详细的数据类型介绍

    任意一种开发语言都有其数据类型,并且数据类型对于一门开发语言来说是最基本的构成,同时也是最基础的语法.当然,kotlin也不例外.kotlin的数据类型和Java是大致相同的,但是他们的写法不同,并且 ...

  9. Kotlin 基本数据类型

    Kotlin 的基本数值类型包括 Byte.Short.Int.Long.Float.Double 等.不同于Java的是,字符不属于数值类型,是一个独立的数据类型. 类型 位宽度 Double 64 ...

随机推荐

  1. #2590. 「NOIP2009」最优贸易

    C 国有 n 个大城市和 m 条道路,每条道路连接这 n 个城市中的某两个城市.任意两个城市之间最多只有一条道路直接相连.这 m 条道路中有一部分为单向通行的道路,一部分为双向通行的道路,双向通行的道 ...

  2. P1392 取数[堆]

    题目描述 在一个n行m列的数阵中,你须在每一行取一个数(共n个数),并将它们相加得到一个和.对于给定的数阵,请你输出和前k小的取数方法. 解析 写这题完全自闭. 根本没联想起远古时期做的 P1631 ...

  3. Linux 服务器性能出问题,排查下这些参数指标

    taozj马哥Linux运维 一个基于 Linux 操作系统的服务器运行的同时,也会表征出各种各样参数信息.通常来说运维人员.系统管理员会对这些数据会极为敏感,但是这些参数对于开发者来说也十分重要,尤 ...

  4. css垂直居中的常用方法

    CSS实现垂直居中的常用方法 2017-04-17 渔歌 前端开发 来自:渔歌 - 博客园 链接:www.cnblogs.com/yugege/p/5246652.html(点击尾部阅读原文前往) 已 ...

  5. 接口-DBLINK初尝试

    需求: 将寿险核心库中的黑名单数据提取到团险核心中,供团险核心使用,并且在核心前端页面需配置对应的菜单,提供相应的按钮,该接口采用dblink的方式进行提取. 通过本地数据库配置dblink访问远程数 ...

  6. 拉格朗日插值matlab实现

    已给sin0.32=0.314567,sin0.34=0.333487,sin0.36=0.352274,用线性插值及抛物插值计算sin0.3367的值并估计截断误差. 1. 线性插值 clc;cle ...

  7. 什么是粘包? socket 中造成粘包的原因是什么? 哪些情况会发生粘包现象?

    只有TCP有粘包现象,UDP永远不会粘包! 粘包:在接收数据时,一次性多接收了其它请求发送来的数据(即多包接收).如,对方第一次发送hello,第二次发送world, 在接收时,应该收两次,一次是he ...

  8. 定位的盒子叠放顺序z-index

    1.正常情况,按照顺序,最后的盒子在最上面,默认z-index为02.当使用z-index,数字越大,越优先显示在上面3.注意,只要定位的盒子才可以使用该方法 <body> <div ...

  9. loj #137 and #6021

    最小瓶颈路 加强版 重构树 最小生成树在合并 (x, y) 时,新建节点 z,link(x, z), link(y, z), 新建节点的权值为 w_{x,y}, 这样的 话任意两点的 answer 为 ...

  10. Solution

    小五的游戏 小碎骨的子集 芙兰朵露的框框 ⑨要求和