Scala中能否创建case object序列及case object类型的Seq?
问题解答:Scala中case object的序列相关问题
嘿,这是个挺常见的Scala类型小坑,我来给你掰扯清楚:
1. Scala中能否拥有case object的序列?
当然可以!case object是Scala里的单例实例,你完全可以把它放进Seq里。比如:
case object SuccessResult val successSeq = Seq(SuccessResult, SuccessResult) // 完全合法
这里的序列里其实都是同一个单例实例,语法上完全没问题。
2. Scala中能否定义case object类型的Seq?
这里得注意一个关键细节:case object的名字是实例,不是类型。你写的示例代码case class Results(successes: Seq[SuccessResult])报错,就是因为你把实例当成类型来用了——IntelliJ标红就是在提示你:SuccessResult是个对象,不是可以用来标注Seq元素类型的类型。
那正确的做法有两种:
方式一:使用单例类型(SuccessResult.type)
每个单例对象都有一个对应的单例类型,格式是对象名.type,用它来标注Seq的元素类型就合法了:
case object SuccessResult case class Results(successes: Seq[SuccessResult.type]) // 使用示例 val myResults = Results(Seq(SuccessResult, SuccessResult))
方式二:定义父类型(更推荐)
如果以后可能需要扩展其他类似的结果类型(比如失败结果),更灵活的方式是先定义一个父特质/类,让case object继承它,然后用父类型作为Seq的元素类型:
// 定义父特质 trait OperationResult // case object继承这个特质 case object SuccessResult extends OperationResult case object FailureResult extends OperationResult // 用父类型定义Seq case class Results(successes: Seq[OperationResult]) // 使用示例 val mixedResults = Results(Seq(SuccessResult, FailureResult))
这样既解决了类型问题,还保留了扩展的灵活性,是Scala里处理这类场景的常规做法。
内容的提问来源于stack exchange,提问作者J Hubbard
相关产品推荐
相关产品推荐

