Por que Scala avisa sobre apagamento de tipo no primeiro caso, mas não no segund

Tenho duas funções (estas não foram editadas desde o original - algumas das respostas abaixo estão respondendo às originais que retornaram uma sequência de ()):

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

que eu ingênuo pensei que eram os mesmos. Mas Scala dá isso apenas para o primeiro:

warning: non variable type-argument A in type pattern List[A]
is unchecked since it is eliminated by erasure

Acho que entendi por que esse erro ocorreu no primeiro: Scala acha que estou tentando usar o tipo como uma condição no padrão, ou seja, uma partida contra oList[B](_, _) deve falhar se B não herdar de A, exceto que isso não pode acontecer porque o tipo é apagado nos dois caso

Então duas perguntas:

1) Por que o segundo não dá o mesmo avis

2) É possível convencer Scala de que o tipo é realmente conhecido no momento da compilação e, portanto, não pode falhar em corresponde

edit: eu acho queesta responde a minha primeira pergunta. Mas ainda estou curioso sobre o segund

edit: agilesteel mencionado em um comentário que

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

não produz nenhum aviso. Como isso é diferente defoo1 (não deveria o[Int] parâmetro @ será apagado da mesma forma que o[A] parâmetro é)?

questionAnswers(3)

yourAnswerToTheQuestion