Scala协变类型T出现在不变位置

时间:2016-03-30 12:16:23

标签: scala playframework playframework-2.0

我有这个特点:

trait Delivery[T] {
  def form(): Form[T]
}

其中Form来自play2 framework。

然后我有实现Delivery trait的对象:

case class NewPostValidator(town: String, number: Int)

object NewPost extends Delivery[NewPostValidator]{
  def form(): Form[NewPostValidator] = Form(mapping(
    "town" -> nonEmptyText,
    "number" -> number)(NewPostValidator.apply)(NewPostValidator.unapply))
}

现在我想编写接受实现特征交付的对象列表的函数。我不能为它的参数写类型。如果我试着写这个像

list: List[Delivery[AnyRef]]

我遇到类型不匹配错误,如果我将交付特征更改为:

trait Delivery[+T] {
    def form(): Form[T]
}

我有Scala协变类型T出现在不变位置错误。 如何描述此参数的类型?

1 个答案:

答案 0 :(得分:1)

我不确定您是否希望方法内的所有表单具有相同的基础类型,或者您是否关心Form内的返回类型。理解这里发生的事情会很好。

trait Delivery[T] {
  def form(): Form[T]
}

case class NewPostValidator(town: String, number: Int)

object NewPost extends Delivery[NewPostValidator]{
  def form(): Form[NewPostValidator] = Form(mapping(
    "town" -> nonEmptyText,
    "number" -> number)(NewPostValidator.apply)(NewPostValidator.unapply))

  def accept[T <: Delivery[_]](list: List[T]): List[Form[_]] = {
    list.map(_.form())
  }

}