У меня есть две функции (не они были отредактированы с оригинала - некоторые из ответов ниже отвечают на исходные, которые вернули последовательность ()):
def foo1[A](ls: Iterable[A]) : Iterator[A] =
for (List(a, b) <- ls sliding 2) yield a
def foo2[A](ls: Iterable[A]) : Iterator[A] =
for (a::b::Nil <- ls sliding 2) yield a
, которые я наивномысли были одинаковыми.Но Scala дает это убыль только для первого:
warning: non variable type-argument A in type pattern List[A]
is unchecked since it is eliminated by erasure
Я думаю, я понимаю, почему он дает эту ошибку для первого: Scala считает, что я пытаюсь использовать тип в качестве условия нашаблон, то есть совпадение с List[B](_, _)
должно завершиться неудачей, если B не наследует от A, за исключением того, что это не может произойти, потому что тип стирается в обоих случаях.
Итак, два вопроса:
1) Почему второй не дает того же предупреждения?
2) Можно ли убедить Scala, что тип на самом деле известен во время компиляции и, следовательно, не может не совпадать?
edit: я думаю, это отвечает моимПервый вопрос .Но мне все еще любопытно по поводу второго.
edit: agilesteel упоминает в комментарии, что
for (List(a, b) <- List(1,2,3,4) sliding 2) yield ()
не выдает предупреждения.Чем это отличается от foo1
(не следует ли стирать параметр [Int]
так же, как параметр [A]
)?