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