在泛型中使用Nothing是一种好习惯吗?

Dmi*_*nko 2 kotlin

就像在这个例子中:

sealed class Option<T>

object None : Option<Nothing>() // <-- like this

class Some<T> : Option<T>()
Run Code Online (Sandbox Code Playgroud)

或者,如果这不是一个好习惯,我应该在这里使用什么呢?

对此有任何官方回应/文章吗?或者有没有论证这是一个好习惯?

我知道这Nothing被设计为用作永不返回任何值的函数的返回值的类型,所以我不确定将它用作泛型参数是否是有效用途.

我知道有一篇文章说你可以做到,但我不确定我是否可以相信它.

koptional的作者使用它,但我不知道我是否也可以相信.

此外,看起来在Scala Option中实现的类似,None类型Option[Nothing]和Scala Nothing类似于Kotlin的Nothing.

hot*_*key 5

我同意@ zsmb13的评论.使用Nothing泛型类型层次是完全合法的,甚至给出了其它选项的好处:

  • 首先,Nothing作为任何其他类型的子类型嵌入在Kotlin类型系统中,因此它与泛型方差一起使用.例如,Option<Nothing>可以传递到Option<out Foo>预期的位置.

  • 其次,Nothing当静态成员类型调用时,编译器将执行控制流检查并检测无法访问的代码.

另请参阅:Kotlin类型层次结构的旋风之旅

  • 在那里,看!这个人来自JetBrains:P (2认同)