我如何模拟Either?

时间:2015-02-20 11:16:24

标签: scala generics covariance either

左边的编译器抱怨(e):左类型的表达式(列表[ServiceError,Nothing])不符合预期类型[E,R]

sealed trait ServiceResult[+E <: List[ServiceError], +R ] {
      def toEither: Either[E , R] = this match {
        case Success(a) => Right(a)
        case Failure(e) => **Left(e)**
      }
    }

    final case class Success[+R](a: R) extends ServiceResult[Nothing, R] {}

    final case class Failure[+T <: ServiceError](e: List[T]) extends ServiceResult[List[T], Nothing]{}

我的要求在下面解释,

所以......我有一个特质ServiceError。后端上的每个服务都有自己的错误,这些错误扩展了这个特性。当我从休息层做请求时,

val r = subnetService ? GetByIdWithInfo( SubnetId( id ) )
val r2 = r.mapTo[ ServiceResult [ SubnetServiceError, SubnetWithInfoDTO ] ] )

我希望有一个像[A,B]这样的类型但有一些额外的约束。如果服务器出现错误(或错误),请返回List[ServiceError]或返回result

2 个答案:

答案 0 :(得分:0)

我认为你想要的只是,

trait ServiceError

trait ServiceResult

type ServiceEither = Either[ List[ ServiceError ], ServiceResult ]

如果这与您的要求不符,请在评论中说明。

答案 1 :(得分:0)

以下是否适用于您?

sealed trait ServiceResult[+E <: ServiceError, +R] {
  def toEither: Either[List[E], R] = this match {
    case Success(a) => Right(a)
    case Failure(e) => Left(e)
  }
}

final case class Success[+R](a: R) extends ServiceResult[Nothing, R] {}

final case class Failure[+T <: ServiceError](e: List[T]) extends ServiceResult[T, Nothing] {}