2016-03-30 7 views
0

У меня есть эта черта:Scala ковариантен типа T происходит в инвариантной позиции

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

где Form находится в рамках PLAY2.

Тогда у меня есть объект, который реализует признак доставки:

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

Какая точная ошибка? Как указано выше, вы можете использовать List [Delivery [_]]. Вы не должны просто бросать ковариацию, если не знаете, что это значит. – slouc

+0

Возможный дубликат [ковариантного типа T встречается в инвариантном положении] (http://stackoverflow.com/questions/11721936/covariant-type-t-occurs-in-invariant-position) –

ответ

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()) 
    } 

} 
+0

Отлично. Это то, что я искал. – user2975535