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

时间:2018-10-29 16:14:38

标签: kotlin

如本例所示:

sealed class Option<T>

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

class Some<T> : Option<T>()

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

对此有任何官方回应/文章吗?还是有人认为这是一个好习惯?

我知道Nothing被设计为用作永不返回任何值的函数的返回值类型,因此我不确定将其用作通用参数是否有效。

我知道有一个article表示您可以这样做,但是我不确定是否可以信任它。

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

此外,看起来在Scala Option中实现的方式与此类似,None具有类型Option[Nothing],而Scala的Nothing与Kotlin的Nothing类似。

1 个答案:

答案 0 :(得分:5)

我同意@zsmb13's comment。在泛型类型层次结构中使用Nothing是完全有效的,甚至比其他选项也有好处:

  • 首先,Nothing作为任何其他类型的子类型被嵌入Kotlin类型系统中,因此它与generics variance一起使用时效果很好。例如,可以在期望Option<Nothing>的地方传递Option<out Foo>

  • 第二,当静态知道类型后,在Nothing返回成员调用之后,编译器将执行控制流检查并检测不可达的代码。

另请参阅:A Whirlwind Tour of the Kotlin Type Hierarchy