加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

为什么Scala在第一种情况下警告类型擦除,但不是第二种情况?

发布时间:2020-12-16 19:05:27 所属栏目:安全 来源:网络整理
导读:我有两个功能(不是这些已经被编辑自原来的 – 以下的一些答案是响应原来的,返回一个序列()): def foo1[A](ls: Iterable[A]) : Iterator[A] = for (List(a,b) - ls sliding 2) yield adef foo2[A](ls: Iterable[A]) : Iterator[A] = for (a::b::Nil - ls sli
我有两个功能(不是这些已经被编辑自原来的 – 以下的一些答案是响应原来的,返回一个序列()):

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读