4.7 kotlin.Nothing类型
Kotlin中没有类似Java和C中的函数没有返回值的标记void
,但是拥有一个对应Nothing
。在Java中,返回void
的方法,其返回值void
是无法被访问到的:
public class VoidDemo {
public void voidDemo() {
System.out.println("Hello,Void");
}
}
测试代码:
@org.junit.runner.RunWith(org.junit.runners.JUnit4.class)
public class VoidDemoTest {
@org.junit.Test
public void testVoid() {
VoidDemo voidDemo = new VoidDemo();
void v = voidDemo.voidDemo(); // 没有void变量类型,无法访问到void返回值
System.out.println(voidDemo.voidDemo()); // error: 'void' type not allowed here
}
}
在Java中,void
不能是变量的类型。也不能被当做值打印输出。但是,在Java中有个包装类Void
是 void
的自动装箱类型。如果你想让一个方法返回类型 永远是 null 的话, 可以把返回类型置为这个大写的V的Void
类型。
代码示例:
public Void voidDemo() {
System.out.println("Hello,Void");
return null;
}
测试代码:
@org.junit.runner.RunWith(org.junit.runners.JUnit4.class)
public class VoidDemoTest {
@org.junit.Test
public void testVoid() {
VoidDemo voidDemo = new VoidDemo();
Void v = voidDemo.voidDemo(); // Hello,Void
System.out.println(v); // null
}
}
这个Void
就是Kotlin中的Nothing?
。它的唯一可被访问到的返回值也是null
。
在Kotlin类型层次结构的最底层就是类型Nothing
。
正如它的名字Nothing所暗示的,Nothing
是没有实例的类型。
代码示例:
>>> Nothing() is Any
error: cannot access '<init>': it is private in 'Nothing'
Nothing() is Any
^
注意:Unit与Nothing之间的区别: Unit类型表达式计算结果的返回类型是Unit。Nothing类型的表达式计算结果是永远不会返回的(跟Java中的void
相同)。
例如,throw关键字中断的表达式的计算,并抛出堆栈的功能。所以,一个throw Exception
的代码就是返回Nothing
的表达式。代码示例:
fun formatCell(value: Double): String =
if (value.isNaN())
throw IllegalArgumentException("$value is not a number") // Nothing
else
value.toString()
再例如, Kotlin的标准库里面的exitProcess
函数:
@file:kotlin.jvm.JvmName("ProcessKt")
@file:kotlin.jvm.JvmVersion
package kotlin.system
/**
* Terminates the currently running Java Virtual Machine. The
* argument serves as a status code; by convention, a nonzero status
* code indicates abnormal termination.
*
* This method never returns normally.
*/
@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.")
}
Nothing?可以只包含一个值:null。代码示例:
>>> var nul:Nothing?=null
>>> nul = 1
error: the integer literal does not conform to the expected type Nothing?
nul = 1
^
>>> nul = true
error: the boolean literal does not conform to the expected type Nothing?
nul = true
^
>>> nul = null
>>> nul
null
从上面的代码示例,我们可以看出:Nothing?
它唯一允许的值是null
,被用作任何可空类型的空引用。
综上所述,我们可以看出Kotlin有一个简单而一致的类型系统。Any?
是整个类型体系的顶部,Nothing
是底部。如下图所示:
当前内容版权归 JackChan1999 或其关联方所有,如需对内容或内容相关联开源项目进行关注与资助,请访问 JackChan1999 .