Списки в Scala являются ковариантными (List[A+]
). Я обнаружил, что это вызывает у меня больше проблем, чем что-либо еще, и я ищу способ применения инвариантности типов в своих списках. Далее следует дать ошибку компиляции:Как можно ввести инвариантность типа?
scala> val l: List[Int] = List(1, 2, 3)
l: List[Int] = List(1, 2, 3)
scala> "string" :: l
res0: List[Any] = List(string, 1, 2, 3)
scala> 1.0 :: l
res1: List[AnyVal] = List(1.0, 1, 2, 3)
Edit: Обратите внимание, что это сделано на примере, и я хотел бы знать, если есть универсальный решение, которое работает на всех Скале Seq
, Set
и Map
, или даже любой признак, принимающий параметр типа. Если это невозможно, и единственный вариант - отказаться от коллекций Scala за что-то вроде scalaz или psp-view, то это ответ.
Задание типа результата везде означает, что я отказываюсь от вывода типа. Обертывание/расширение всех методов scala.collection._ займет много времени, и мне нужно будет нести этот код во всех моих проектах ... – OlivierBlanvillain
@OlivierBlanvillain: вам не нужно указывать тип результата везде. Вы можете просто указать его для результата всех методов и всех членов класса. Таким образом, вы получите ошибку компиляции. – senia
Я всегда устанавливал типы возвращаемых данных, но мне все еще удалось написать багги код из-за неопределенности ковариации;) – OlivierBlanvillain