[英]scala lower bound type “with” another type?
这是代码
class Result[A] {
def map[B](f: (Result[A] => Result[B]), xResult: Result[A]) = {
xResult match {
case Success(x) => Success(f(xResult))
case Failure(errs) => Failure(errs)
}
}
def apply[B](fResult: Result[A], xResult: Result[B]) = {
(fResult, xResult) match {
case (Success(f), Success(x)) => Success((f, x))
case (Failure(errs), Success(a)) => Failure(errs)
case (Success(a), Failure(errs)) => Failure(errs)
case (Failure(errs), Failure(errs2)) => Failure(List(errs, errs2))
}
}
}
case class Success[A](a: A) extends Result[A] {}
case class Failure[A](a: A) extends Result[A] {}
def createCustomerId(id: Int) = {
if (id > 0)
Success(id)
else
Failure("CustomerId must be positive")
}
这是问题
1)从方法createCustomer的类型推断得出的结果是这样的
Product with Serializable with Result[_ >: Int with String]
我对“带有可序列化的产品”的东西没有任何疑问,我想知道的是如何对结果进行有意义的处理,而出于好奇,如何初始化这样的类型。
假设我有另一种方法,如下所示
def createCustomer(customerId: Result[_ >: Int with String], email: Result[String]) = {
how can i read/do something with "customerId" argument
}
如何初始化这样的类型
val x: Result[Int with String] = ???
笔记:
问题是您的类型定义指出Success
和Failure
采用相同的参数类型。 但是,您实际上想将其他类型的参数放入“ Failure
同时仍然保持协方差。 这是最简单的解决方法:
class Result[A] {
def map[B](f: (Result[A] => Result[B]), xResult: Result[A]) = {
xResult match {
case Success(x) => Success(f(xResult))
case Failure(errs) => Failure(errs)
}
}
def apply[B](fResult: Result[A], xResult: Result[B]) = {
(fResult, xResult) match {
case (Success(f), Success(x)) => Success((f, x))
case (Failure(errs), Success(a)) => Failure(errs)
case (Success(a), Failure(errs)) => Failure(errs)
case (Failure(errs), Failure(errs2)) => Failure(List(errs, errs2))
}
}
}
case class Success[A](a: A) extends Result[A] {}
case class Failure[A, B](a: B) extends Result[A] {}
object TestResult extends App {
def createCustomerId(id: Int): Result[Int] = {
if (id > 0)
Success(id)
else
Failure("CustomerId must be positive")
}
println(createCustomerId(0))
println(createCustomerId(1))
}
印刷品:
Failure(CustomerId must be positive)
Success(1)
如果您不使用Result[Int]
注释createCustomerId
返回类型,则编译器将Result[_ <: Int] with Product with Serializable
来推断Result[_ <: Int] with Product with Serializable
这可能不理想,但也不太差。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.