возможно это поможет

я есть две функции (не они были отредактированы с оригинала - некоторые из ответов ниже отвечают на оригинальные, которые вернули последовательность ()):

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, что тип на самом деле известен во время компиляции и, следовательно, не может не совпадать?

редактировать: я думаюэто отвечает на мой первый вопрос, Но мне все еще интересно второе.

редактировать: agilesteel упоминается в комментарии,

for (List(a, b) <- List(1,2,3,4) sliding 2) yield ()

не выдает предупреждения. Чем это отличается отfoo1 (не должен[Int] параметр стирается так же, как[A] параметр есть)?

Ответы на вопрос(3)

Ваш ответ на вопрос