Почему Scala предупреждает об стирании типа в первом случае, но не во втором?

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

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 думает, что я пытаюсь использовать тип как условие для шаблона, то есть совпадение с Список [B] (_, _) должен завершиться ошибкой, если B не наследует от A, за исключением того, что этого не может произойти, потому что тип стирается в обоих случаях.

Итак, два вопроса:

1) Почему второй не дает такого же предупреждения?

2) Можно ли убедить Scala в том, что тип действительно известен во время компиляции и, следовательно, не может не совпадать?

edit: Я думаю это отвечает на мой первый вопрос . Но мне все еще интересно узнать о втором.

edit: agilesteel упоминается в комментарии, который

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

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

10
задан Community 23 May 2017 в 11:56
поделиться