为什么Scala在第一种情况下警告类型擦除,但不是第二种情况?
我有两个功能(不是这些已经被编辑自原来的 – 以下的一些答案是响应原来的,返回一个序列()):
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在编译时实际上已知类型,因此不可能失败? 编辑:我想this answers my first question.但是我仍然对第二个好奇. 编辑:agilesteel在评论中提到 for (List(a,b) <- List(1,2,3,4) sliding 2) yield () 不产生警告.如何与foo1不同([A]参数不应该与[A]参数相同)删除[Int]参数? 解决方法
我不知道这里发生了什么,但静态类型的Iterable [A] .sliding是Iterator [Iterable [A]],而不是Iterator [List [A]],它将是List [A]的静态类型.滑动.
你可以尝试接收Seq而不是Iterable,那个工作也是.编辑与以前声明的相反,Iterable和Seq都是共同的,所以我不知道有什么不同. END EDIT滑动的定义也很奇怪: def sliding [B >: A] (size: Int): Iterator[Iterable[A]] 看到它需要一个从来不会被使用的B,超类A?对于使用Iterator.sliding,没有问题: def sliding [B >: A] (size: Int,step: Int = 1): GroupedIterator[B] 无论如何,在第二种情况下: for (a::b::Nil <- ls sliding 2) yield a 在这里你是分解列表两次,而对于每个分解,头的类型是针对A进行的.由于头的类型没有被清除,所以你没有问题.这也是一个猜测. 最后,如果您将ls转换为列表,则不会有问题.不过,我不认为有什么可以做的.否则你也可以这样写: def foo1[A](ls: Iterable[A]) : Iterator[A] = for (Seq(a,b) <- ls.iterator sliding 2) yield a (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |