呼吁没有任何方法(Calling any method on Nothing)

2019-09-26 06:22发布

虽然没有明确指出 ,没有什么是所有类型的亚型,这(其中包括)建议吧:

fun f(x:Float) { }
fun g(x:Char) { }

fun dead(q: Nothing) {
    f(q)
    g(q)
}

然而,这种失败,“未解决的参考”:

fun dead(q: Nothing) {
    q.not()
}

这是一个错误或功能?

笔记:

  1. 的第一代码编译片(有警告),第二不
  2. 这是可能的使用Nothing类型的接收器,例如调用toString()
  3. 这是合法的: {b:Boolean -> b.not()}(q)
  4. 上溯造型太: (q as Boolean).not()
  5. 等效问题斯卡拉

Answer 1:

NothingNothing原因的。 你不能调用它的任何功能。 除了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表示,没有子女的叶节点。



Answer 2:

前提本身就没有意义了。 Nothing是不能被实例化的类。 你永远不会有持有的变量Nothing实例。

这意味着,需要一个功能Nothing作为参数可以永远不会被调用,因为你不能让一个Nothing实例来传递给它。 你里面写东西是无关紧要的,因为就是这样存在摆在首位的功能。

Nothing做成像一个亚型的所有类型,这样的语言功能,如某些用途throwreturn与类型系统的工作很好。 从本质上讲,编译器可让你通过一个Nothing在地方需要一些其他类型的,因为它知道你永远也不会真正到达该代码(因为再次,你不能让一个Nothing实例),所以也没有不管你传递什么。



文章来源: Calling any method on Nothing