我希望能够传递“无”的可选原因。我尝试了延长“无”恩:扩展选项w /原因
case class NoneReason(reason: String) extends None
却得到了一个“未发现:类型无”,然后我想:
case class NoneReason(reason: String) extends Option[Nothing] {
def isEmpty = true
def get = throw new NoSuchElementException("None.get")
}
,但我从密封类选一“”非法继承“
我猜这是一个特殊的情况,因为‘无’实际上是空或东西的别名。
我认为复制选项源,并将其重命名为TriOption或东西,但日似乎很难维持。什么将是一个优雅的方式来解决这个问题?
您可以使用'Try [T]'或'Either [String,T]'而不是创建自己的类型。 – Lee 2014-09-24 21:17:32
没有特殊情况,'None'不是任何别名,尤其不是'null'的别名。所有'Option'类都是密封的,最终的或者case对象,这些都是你的意图,你不应该能够扩展这些,你不能。一个简单的例子是'Option(something)match {case Some(x)=> ... case None => ...}'编译器可以检查您是否匹配了所有可能的情况,因为'Option'不是可扩展到基础包之外。正如@Lee所建议的,你应该使用不同的数据结构,比如'Either [String,T',它基本上是你的'NonReason'类型。 – Noah 2014-09-24 21:23:53
子类型不是惯用的FP;此外,它使代码更复杂,并禁用了例如匹配情况静态耗尽检查。 – 2014-09-25 12:17:42