我有这个特点:
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出现在不变位置错误。 如何描述此参数的类型?
答案 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())
}
}