Kotlin返回值Unit、Nothing与Any

本文探讨了Kotlin中的Unit类型,与Java void类似,以及Nothing类型的特性,包括Void在Java中的对应和两者在表达无返回值和不可能返回值的区别。通过实例演示了它们在函数声明和实际调用中的运用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Unit类型

Kotlin也是面向表达的语言。Kotlin中Unit类型实现了与java中void一样的功能。

public object Unit {// Unit类型是一个object对象类型
    override fun toString() = "kotlin.Unit" // toString函数返回值
}

当一个函数没有返回值的时候,我们用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类型

在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类型就跟Java的object类型一样,是所有类的父类。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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值