虽然没有明确指出 ,没有什么是所有类型的亚型,这(其中包括)建议吧:
fun f(x:Float) { }
fun g(x:Char) { }
fun dead(q: Nothing) {
f(q)
g(q)
}
然而,这种失败,“未解决的参考”:
fun dead(q: Nothing) {
q.not()
}
这是一个错误或功能?
笔记:
- 的第一代码编译片(有警告),第二不
- 这是可能的使用
Nothing
类型的接收器,例如调用toString()
- 这是合法的:
{b:Boolean -> b.not()}(q)
- 上溯造型太:
(q as Boolean).not()
- 等效问题斯卡拉
Nothing
是Nothing
原因的。 你不能调用它的任何功能。 除了not()
仅适用于Boolean
所以它不存在于Nothing
。 事实上,有上没有方法, Nothing
:
/**
* Nothing has no instances. You can use Nothing to represent "a value that never exists": for example,
* if a function has the return type of Nothing, it means that it never returns (always throws an exception).
*/
public class Nothing private constructor()
文档几乎解释了它的存在。
有一个漏洞,但。 如果返回会发生什么事Nothing?
从功能?
fun dead(): Nothing? {
return null
}
那就对了。 它只能返回null
:
@JvmStatic
fun main(args: Array<String>) {
dead() // will be null
}
我不会说有一个有效的使用情况下做到这一点,但它是可能的。
举一个例子Nothing
指示在树上虚无:
sealed class Tree<out T>() {
data class Node<out T>(val value: T,
val left: Tree<T> = None,
val right: Tree<T> = None): Tree<T>()
object None: Tree<Nothing>()
}
这里Nothing
表示,没有子女的叶节点。
前提本身就没有意义了。 Nothing
是不能被实例化的类。 你永远不会有持有的变量Nothing
实例。
这意味着,需要一个功能Nothing
作为参数可以永远不会被调用,因为你不能让一个Nothing
实例来传递给它。 你里面写东西是无关紧要的,因为就是这样存在摆在首位的功能。
Nothing
做成像一个亚型的所有类型,这样的语言功能,如某些用途throw
和return
与类型系统的工作很好。 从本质上讲,编译器可让你通过一个Nothing
在地方需要一些其他类型的,因为它知道你永远也不会真正到达该代码(因为再次,你不能让一个Nothing
实例),所以也没有不管你传递什么。