如本例所示:
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
类似。
答案 0 :(得分:5)
我同意@zsmb13's comment。在泛型类型层次结构中使用Nothing
是完全有效的,甚至比其他选项也有好处:
首先,Nothing
作为任何其他类型的子类型被嵌入Kotlin类型系统中,因此它与generics variance一起使用时效果很好。例如,可以在期望Option<Nothing>
的地方传递Option<out Foo>
。
第二,当静态知道类型后,在Nothing
返回成员调用之后,编译器将执行控制流检查并检测不可达的代码。