【发布时间】:2011-11-01 10:25:27
【问题描述】:
我有两个函数(这些函数自原始函数以来没有被编辑过——下面的一些答案是对返回 () 序列的原始函数的响应):
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 认为我正在尝试将类型用作模式的条件,即如果 B 不继承自,则与 List[B](_, _) 的匹配应该失败A,除了这不可能发生,因为在这两种情况下都会删除类型。
所以两个问题:
1) 为什么第二个没有给出同样的警告?
2) 是否有可能让 Scala 相信该类型在编译时实际上是已知的,因此不可能匹配失败?
编辑:我认为this answers my first question。但我还是对第二个很好奇。
编辑:agilesteel 在评论中提到
for (List(a, b) <- List(1,2,3,4) sliding 2) yield ()
不产生任何警告。这与foo1 有什么不同(不应该像[A] 参数一样删除[Int] 参数吗)?
【问题讨论】:
标签: scala pattern-matching type-erasure