首页 > 其他分享 >Kotlin中的Any、Unit、Nothing

Kotlin中的Any、Unit、Nothing

时间:2023-06-01 12:33:23浏览次数:27  
标签:name Kotlin 类型 Nothing Any Unit

Any

Kotlin中的Any即相当于Java中的Object类,是一切其他非空类型的父类型,Any?则表示一切可空类型的父类型。

Any拥有三个方法:

  • equals()
  • hashCode()
  • toString()

事实上Any在编译成字节码后正是会转成java.lang.Object类。

Unit

Kotlin中的Unit即相当于Java中的void关键字,用于表示返回空结果的函数。

fun test() : Unit {
 	println("test return void")
	return Unit
}

其中Unit可以省略,即等同于

fun test() {
 	println("test return void")
}

转换成java代码:

void test() {
	System.out.println("test return void")
}

Unit 在Kotlin中实际是一个全局的static对象,Unit的源码如下:

public object Unit {
    override fun toString() = "kotlin.Unit"
}

Nonthing

Kotlin中的Nothing是一个很特别的存在,它有点类似于Java中的java.lang.Void类。

Kotlin中的Nothing的源码如下:

public class Nothing private constructor()

Kotlin中的Nothing类的主构造函数是private的,使得Nothing类不可能被实例化。

Java中的Void类的源码如下:

public final class Void {
    /*
     * The Void class cannot be instantiated.
     */
    private Void() {}
}

同样的,Java中Void类也是无法被实例化的。

Kotlin中Nothing通常用在抛出异常的场景,表示一段代码不应该执行到,例如:

fun fail(message: String): Nothing {
    throw IllegalArgumentException(message)
}

上述代码中fail函数返回的类型是Nothing,表示的含义即fail函数不会有返回值。事实上Kotlin中throw表达式是有返回的类型的,返回的类型就是Nothing类型。

val name = person.name ?: fail("Name required")

上述代码中的name变量在非空的时候类型就是String,而在走到失败分支的时候其类型就是Nothing,上述代码还可以这样写:

val name: String = person.name ?: fail("Name required")

这就是Nothing的另一个特性,Nothing类可以作为所有类的子类型,所以上述代码中Nothing类型可以是String类的子类型。

我们可以用Unit来作为对比:

val name: String = person.name ?: Unit			//编译器会报错Type mismatch

那么Nothing?表示什么呢?Nothing?表示可空的Nothing类型,Kotlin中的null就是Nothing?类型的唯一值,也就是说所有可空类型的对象的初始值就是null

标签:name,Kotlin,类型,Nothing,Any,Unit
From: https://www.cnblogs.com/jqctop1/p/17429315.html

相关文章

  • Kotlin中的字符串模板
    字符串模板的使用在Kotlin中可以直接在字符串字面值中引用变量,例如:valname="william"valstr="mynameis${name}"println(str)并且Kotlin官方文档建议使用字符串模板来替代字符串连接符的使用,原因在于我们知道String类是immutable的,字符串连接符的实现原理是每次都......
  • Kotlin的空安全
    Kotlin中的可空类型在Kotlin中可以通过在类型后加一个?来表示该类型是可空类型,例如:varname:String?varid:String上述代码表示name是一个可空的String类型变量,而id是一个不可为空的String类型变量。如果在代码中试图将一个可空的值赋值给id,则会导致如下的编译错误:Type......
  • [CF9D]How many trees?
    2023-06-01题目题目传送门难度&重要性(1~10):5题目来源Codeforces,luogu题目算法dp解题思路深度最大为\(n\left(1\len\le35\right)\)的二叉树暴力枚举显然不行,考虑dp。设\(f_{i,j}\)表示有\(i\)个节点时,深度不大于\(j\)的二叉树数量。答案容斥:\(f_{n,n}-f_{n......
  • executemany例子
      #!/usr/bin/envpython#coding=utf-8importos,json,urllib,datetime,shutil,random,uuidfromrandomimportchoiceimportpymysqlimporttracebackimporttimegl_mysql_server="192.168.1.183"gl_user_name="root"gl_password=......
  • Kotlin中的扩展函数和扩展属性
    扩展函数Kotlin中可以给一个类额外添加这个类中没有的函数,即扩展函数。例如:funInt.dp2px(context:Context){ TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,this.toFloat(),context.resources.displayMetrics)}funtest(){ println(16.dp2px())}上述代......
  • android开发java.lang.NoClassDefFoundError: org/jetbrains/kotlin/cli/common/Prope
    问题:编译Android项目出现java.lang.NoClassDefFoundError:org/jetbrains/kotlin/cli/common/PropertiesKt原因:项目使用发JDK版本和Kotlin版本不一致或者说不对应导致gradle找不到对应的类解决方法:我的解决方法是降低JDK的版本到1.8,具体操作是OpenModulesSettings->SDKLoc......
  • c++11: all_of 、 any_of 和 none_of
    有效的字母异位词classSolution{public:boolisAnagram(strings,stringt){if(s.size()!=t.size())returnfalse;intans[26]={0};for(auto&ch:s){++ans[ch-'a'];}for(auto&......
  • java8 stream匹配 anyMatch,allMatch,noneMatch
    anyMatch:判断的条件里,任意一个元素成功,返回trueallMatch:判断条件里的元素,所有的都是,返回truenoneMatch:与allMatch相反,判断条件里的元素,所有的都不是,返回truecount方法,跟List接口中的.size()一样,返回的都是这个集合流的元素的长度,不同的是,流是集合的一个高级工厂,中间操作是工厂里......
  • Gradle 使用 Kotlin 的情况下设置使用 UTF-8
    找了好久才找到该怎么整,在此记录一下原本的样子Groovy下设置UTF-8:tasks.withType(JavaCompile){options.encoding="UTF-8"}但是现在改了,食大便了Kotlin下设置UTF-8tasks.withType<JavaCompile>{options.encoding="utf-8"}将此段话加入到build......
  • From Java To Kotlin:空安全、扩展、函数、Lambda很详细,这次终于懂了
    FromJavaToKotlin,空安全、扩展、函数、Lambda概述(Summarize)Kotlin是什么?可以做什么?Android官方开发语言从Java变为Kotlin,Java有哪些问题?Kotlin的优点Kotlin特性(Features)Kotlin是什么?Kotlin出自于捷克一家软件研发公司JetBrains,这家公司开发出很多优秀的......