Краткий ответ:
Изменить toFixedLoads[S[_] <: Seq[Double]]
на toFixedLoads[S[A] <: Seq[A]]
Длинный ответ:
Когда вы говоритеS[_]
, это тип с более высоким родом .Или, другими словами, это конструктор типа .Это означает, что для получения окончательного правильного типа требуется тип.Вот несколько примеров:
List
- принимает тип, например Int
, для получения правильного типа List[Int]
Option
- принимает тип, напримерInt
, для получения правильного типа Option[Int]
и т. Д.
Конструкторы типов этого типа часто представлены как * -> *
.Вы предоставляете один тип, и вы получаете тип обратно.Есть и другие виды;например, Map
и Either
требуется два типа для получения правильного типа (например, Map[Int, String]
или Either[Error, Foo]
), поэтому их тип * -> * -> *
.Думайте об этом как карри конструктор типа;принимает тип и возвращает функцию, которая принимает тип, а затем вы получаете окончательный, правильный тип.Или, другими словами, требуется два типа для получения окончательного, правильного типа.У вас также может быть конструктор типа, которому нужен конструктор типа для построения правильного типа (например, Monad[F[_]]
), в этом случае тип равен (* -> *) -> *
(например, List -> Monad[List]
).
Поэтому, когда вы говорите, что ваш метод ожидает параметр типа S[Double]
, и вы передаете List(1.0, 2.0, 3.0)
, компилятор выводит S
как List
и жалуется, что List[A]
не является подтипомSeq[Double]
для любого A
.Ваша первая попытка исправить это может быть F[_] <: Seq[_]
, но это не может скомпилировать, потому что внутренние типы по-прежнему не выравниваются.Нам нужно «связать» их чем-то вроде F[A] <: Seq[A] for some A
, которое можно записать просто как F[A] <: Seq[A]
.
Хороший вопрос может быть: «Могу я сказать S <: Seq[Double]
?»Конечно, S
представляет собой правильный тип, так что вы могли бы!Что-то вроде этого работает просто отлично:
def foo[S <: Seq[Double]](s: S) = println(s)
foo(List(1.0, 2.0)) // prints List(1.0, 2.0)
Но, конечно, у вашего S
есть "дыра", потому что ваш параметр метода имеет тип S[Double]
, поэтому он не применим в вашем случае.