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. 编程判断输入的字符是否为‘y’或‘Y’,若是,则输出‘yes’,否则输出‘no’

    #include<stdio.h>void main(){ char ch; ch=getchar(); ch == 'y' || ch == 'Y' ? printf("yes ...

  2. 5.5(OI一本通开始)

    一, 第一个程序有错误, 1, 每个语句(每行?0)要有分号

  3. PHP流程控制之分支结构switch语句的使用

    分支结构switch语句的使用 还记得我们最开始讲了这么一个故事: 王同学家里头特别有钱,所以他的行程方式和正常人的又有些不一样. 他的出行方式呢有6种,如下: 1,司机开车2,民航3,自己家的专机4 ...

  4. 自用ajax的json请求

    function singlePriceSubmit(){ var json={}; json["area"]=areaStr1; json["goodCateIdStr ...

  5. 自用java购物

    @RequestMapping("listgoodscart") public ResultEntity listGoodsCart(@RequestParam(name = &q ...

  6. HEXO的使用

    本文将总结性的介绍如何建立自己的github.io博客,后续会持续补充,进阶.感谢baixin提供的参考文章. 技术选型为github+hexo+idea,首先最简单的阐述下这个东西都干嘛的 1. 技 ...

  7. 洛谷P1288取数游戏2

    题目 博弈论. 考虑先手和后手的关系.然后可以通过统计数值不是0的数的个数来得出答案. \(Code\) #include <bits/stdc++.h> using namespace ...

  8. 深度Linux /etc/profile 环境变量生效问题

    /etc/profile 环境变量生效问题 设置了环境变量后 ,使用source /etc/profile生效后,每次关闭终端后,都需要重新输入source /etc/profile命令使环境变量生效 ...

  9. java学习笔记(3)数据类型、源码、反码、补码、精度损失、基本数据类型互相转换

    关于java中的数据类型: 1.数据类型的作用是什么? 程序当中有很多数据,每一个数据都是有相关类型的,不同数据类型的数据占用的空间大小不同. 数据类型的作用是指导java虚拟机(JVM)在运行程序的 ...

  10. Maven+SSM整合ehcache