¿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)?