我有两个函数(这些函数自原始以来没有被编辑过——下面的一些答案是对返回 () 序列的原始函数的响应):
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 认为我正在尝试使用类型作为模式的条件,即与List[B](_, _)
如果 B 不从 A 继承,则应该失败,但这种情况不会发生,因为在两种情况下都会删除类型。
那么两个问题:
1)为什么第二个没有给出同样的警告?
2)是否有可能让Scala相信该类型在编译时实际上是已知的,因此不可能无法匹配?
编辑:我认为这回答了我的第一个问题 https://stackoverflow.com/questions/5223670/why-this-erasure-warning-with-member-variables-declared-as-a-tuple。但我对第二个还是很好奇。
编辑:agilesteel 在评论中提到
for (List(a, b) <- List(1,2,3,4) sliding 2) yield ()
不会产生任何警告。这和有什么不同foo1
(不应该[Int]
参数被删除就像[A]
参数是)?