¿Por qué Scala advierte sobre el borrado de tipo en el primer caso pero no en el segundo?

Tengo dos funciones (no se han editado desde el original; algunas de las respuestas a continuación responden a las originales que devolvieron una secuencia 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 ingenuamente pensé que eran lo mismo. Pero Scala da esta disminución solo por la primera:

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

Creo que entiendo por qué da ese error para el primero: Scala piensa que estoy tratando de usar el tipo como condición en el patrón, es decir, una coincidencia contraList[B](_, _) debería fallar si B no hereda de A, excepto que esto no puede suceder porque el tipo se borra en ambos casos.

Así que dos preguntas:

1) ¿Por qué el segundo no da la misma advertencia?

2) ¿Es posible convencer a Scala de que el tipo se conoce realmente en tiempo de compilación y, por lo tanto, no puede dejar de coincidir?

edit: creo queesta contesta mi primera pregunta. Pero todavía tengo curiosidad por el segundo.

edit: agilesteel mencionó en un comentario que

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

produce sin advertencia. ¿Cómo es eso diferente defoo1 (no debería el[Int]l parámetro @ se borrará igual que el[A] parámetro es)?

Respuestas a la pregunta(3)

Su respuesta a la pregunta