Any
-
Any是在非空类型层次结构的根,Any?是可空类型层次的根,Any?是Any的超集,Any?是Kotlin类型层次结构的最顶端。
fun main() { //true println(1 is Any) //true println(1 is Any?) //false println(null is Any) //true println(null is Any?) //true println(Any() is Any) }
Nothing与Unit
Unit
-
Kotlin 里没有void,所有函数都有返回类型,所有不显式声明返回类型的函数都会返回
Unit
类型,所以以下两种方式等价fun main() { val info = info() val info1 = info1() //kotlin.Unit println(info) //kotlin.Unit println(info1) } fun info() { println("info") } fun info1(): Unit { println("info") } fun info2(): Unit { println("info") return Unit }
-
Unit
是一个真正的类(对象声明object语法,单例),继承自Any
类,只有一个值,目的在于函数返回Unit
时避免分配内存public object Unit { override fun toString() = "kotlin.Unit" }
-
Unit类型层次结构
Nothing
-
Nothing
是一个 空类型(uninhabited type),也就是说,程序运行时不会出现任何一个Nothing
类型对象。Nothing
还是其他所有类型的子类型 -
在java中,
void
不能是变量类型,也不能作为值打印输出。包装类型Void(void自动装箱类型)
可以输出,如果想让一个方法永远返回null,则可以使用Void
public class VoidTest { public static void main(String[] args) { //null System.out.println(info()); } /** * 此方法只能返回null值,而且必须显示return null * @return */ public static Void info() { System.out.println("void info"); return null; } }
-
java中的
Void
对应Kotlin中的Nothing?
,Nothing类的定义如下,因为构造器是私有的,所以Nothing()不能实例化。java中void对应kotlin中的Nothing。public class Nothing private constructor()
-
在Kolin中throw是表达式,它的类型就是Nothing
>>> fun fail(msg:String) :Nothing{throw IllegalArgumentException(msg) } >>> fail("a") java.lang.IllegalArgumentException: a at Line_10.fail(Unknown Source)
-
Unit与Nothing之间的区别是,Unit类型表达式计算结果的返回类型是Unit,Nothing类型的表达式计算结果是永远不会返回的(与java中的void相同)。
Nothing?
可以只包含一个值null -
层次结构