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. ArcMap 制图出图

    在这里用的数据是:台湾2018年6月人口统计数据来做展示数据. ArcMap 里面主要用到的是:符号系统使用.布局视图等 一.属性中设置元素符号 ArcMap 初次加载数据,默认的是“单一符号”,就是 ...

  2. test20190803 夏令营NOIP训练19

    60+100+0=160 贪婪大陆 面对蚂蚁们的疯狂进攻,小FF的Tower defence宣告失败--人类被蚂蚁们逼到了Greed Island上的一个海湾.现在,小FF的后方是一望无际的大海, 前 ...

  3. git常用命令总结--原创

    0.git status 仓库状态1.git add 工作区-->暂存区2.git commit 暂存区-->版本库3.git log 查看日志4.git reset --hard hea ...

  4. SVM: 实际中使用SVM的一些问题

    使用SVM包来求θ,选择C与核函数 我们使用已经编写好的软件包(这些软件包效率高,用得多,是经无数人证明已经很好的可以使用的软件包)来求θ,而不是自己去编写软件来求它们(就像我们现在很少编写软件来求x ...

  5. C++中得sort函数的比较函数(第三个参数)为什么要声明为static

    sort中的比较函数compare要声明为静态成员函数或全局函数,不能作为普通成员函数,否则会报错. 因为:非静态成员函数是依赖于具体对象的,而std::sort这类函数是全局的,因此无法再sort中 ...

  6. 关闭win10 任务栏窗口预览的步骤:

    win10虽好,但是总有不利于使用的反人类设计,好在可以设置,这也是比较好了的, 作为开发人员,经常会开好几个窗口,但是win10的预览很不好,设计的就是娱乐用途一般,因此必须是把他关了 一下步骤亲自 ...

  7. 【爬虫】把抓到数据存起来——爬虫绝配mongodb

    [爬虫]把抓到数据存起来——爬虫绝配mongodb 视频地址 抓取数据的方法,前面的课程该讲的都已经讲了,爬取下来数据只是第一步,第二步就是要先存起来.我们最容易想到的就是存文件里喽,python写文 ...

  8. javascript之大文件分段上传、断点续传

    这里只写后端的代码,基本的思想就是,前端将文件分片,然后每次访问上传接口的时候,向后端传入参数:当前为第几块文件,和分片总数 下面直接贴代码吧,一些难懂的我大部分都加上注释了: 上传文件实体类: 看得 ...

  9. Problem 7 树状数组+转化

    $des$有一棵 $n$ 个点的以 $1$ 为根的树, 以及 $n$ 个整数变量 $x_i$ .树上 $i$ 的父亲是 $f_i$ ,每条边 $(i,f_i)$ 有一 个权值 $w_i$ ,表示一个方 ...

  10. 面对对大体量矢量数据ArcGIS的优化方法

    大数据量矢量数据的可视化需要解决的问题,就是如何在可接受的短时间内,能展示大数据量的矢量地图. 解决方案一:采用预先渲染的切片进行展示 切片是预先渲染的数据集,也是响应最快的展示方式.目前ArcGIS ...