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

2024-03-12

我有两个函数(这些函数自原始以来没有被编辑过——下面的一些答案是对返回 () 序列的原始函数的响应):

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]参数是)?


我不确定这里发生了什么,但是静态类型Iterable[A].sliding is Iterator[Iterable[A]], not Iterator[List[A]]这将是静态类型List[A].sliding.

您可以尝试接收Seq代替Iterable,这也有效。EDIT与我之前声称的相反,两者Iterable and Seq是协变的,所以我不知道有什么不同。END EDIT的定义sliding也很奇怪:

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

在这里,您将列表分解两次,每次分解的类型head被检查A。由于类型为head没有被删除,你没有问题。这也主要是一个猜测。

最后,如果你转身ls into a List,你不会有问题的。除此之外,我认为你无能为力。否则,你也可以这样写:

def foo1[A](ls: Iterable[A]) : Iterator[A] =
    for (Seq(a, b) <- ls.iterator sliding 2) yield a
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 Scala 在第一种情况下警告类型擦除而不是第二种情况? 的相关文章

随机推荐

  • 跟踪 IP 地址和国家/地区名称 (asp.net)?

    昨天我看到一个网站 其中列出了IP地址和国家名称 说最近访问过的成员 带有国家名称 城市名称的IP地址列表 我可以知道如何跟踪该信息 任何参考或任何代码吗 谢谢 请检查这些问题 检测 估计 ASP NET 中 http 请求的国家 地区 h
  • 用于列出用户的 S3 存储桶内的特定文件夹的 IAM 策略

    我在桶下面有下面的钥匙客户演示 demo for customers customer1 demo for customers customer2 现在我有 2 个客户客户1 and 客户2 这就是我要的 仅授予他们访问权限客户演示 buc
  • 给定一个数的质因数分解,生成该数的所有因数

    如果您已经对一个数字进行质因数分解 那么获得该数字的所有因数的集合的最简单方法是什么 我知道我可以从 2 循环到 sqrt n 并找到所有可整除的数字 但这似乎效率很低 因为我们已经有了质因数分解 我想它基本上是组合 选择函数的修改版本 但
  • 熊猫 corr() 与 corrwith()

    Pandas 提供两种不同的相关函数的原因是什么 DataFrame corrwith 其他 轴 0 drop False 两个DataFrame对象的行或列之间的相关性成对计算 vs DataFrame corr method pears
  • Jackson 序列化 可选,YAML 为空值

    目前我正在使用YAML工厂 https fasterxml github io jackson dataformats text javadoc yaml 2 11 配置ObjectMapper序列化和反序列化Pojos lt gt YAM
  • 显示片段中的对话框?

    我有一些片段需要显示常规对话框 在这些对话框中 用户可以选择是 否答案 然后片段应该做出相应的行为 现在Fragment类没有onCreateDialog 方法来重写 所以我想我必须在包含的外部实现对话框Activity 没关系 但是接下来
  • 当 url 包含锚点时,获取页面加载时网页滚动条的垂直位置

    我使用 jQuery 的scrollTop 方法来获取页面加载时滚动条的垂直位置 我需要在执行 url 中的锚点后获取此值 例如 url www domainname com foo 我可以使用以下代码 它可以在 Firefox 和 IE
  • iPhone 解锁时 Xcode“设备锁定”

    当我尝试构建并运行时 Xcode 说我的设备已锁定 我看了看我的 iPhone 它根本没有锁定 我该如何解决 我的手机设置为 信任 Mac 但我在 Xcode 6 1 1 中仍然遇到此错误 这对我有用 拔掉设备插头 退出 xcode 打开X
  • 测试示例集属性应等于训练示例集 Rapidminer SVM 的 OR 超集

    I am new to Rapid Miner and using SVM Linear in it My model is as I made Training Example set which consist of 3552 exam
  • 动态 Java 整数/长溢出检查与性能

    这是一个相当理论化的问题 因此虽然该语言是 Java 特有的 但任何通用的解决方案都足够了 假设我想编写一个简单的阶乘函数 long factorial int n handle special cases like negatives e
  • Xamarin 表单更改导航栏的背景颜色

    我正在使用 Xamarin Forms 并尝试更改 iOS 上导航栏的背景颜色 我有一个继承自 NavigationPage 的自定义导航栏类 具有可绑定属性和构造函数 用于设置导航栏的颜色 根据我的理解 导航栏顶部有一个默认背景 黑色 X
  • 从 fresco 获取 bitmapdrawable

    我正在尝试从 SimpleDraweeView 获取位图 我已经使用 uri 图像设置了 SimpleDraweeView final Uri uri new Uri Builder scheme UriUtil LOCAL RESOURC
  • 如何阻止 Docker 注册表?

    我想阻止对默认 docker io 注册表的访问 为了安全 IP 保护 我们需要阻止对公共 Docker 中心的推 拉访问 曾经有过many尝试将此作为配置选项 但所有 PR 都不断被拒绝 红帽已经实现了 block registry 和
  • java 图形的多线程

    我有一个java应用程序 可以传输原始数据并相应地绘制实时图 这是通过调用我编写的使用 Graphics 对象的类中的方法来处理的 我在重写的paintComponent方法中实现了算法 以根据最新数据生成所有绘图 我的类中有其他方法来更新
  • 同时在 dplyr 中对多列进行 Shapiro.test

    我正在尝试对数据集运行正态性检验 shapiro wilk 并且我希望同时获得所有列的统计数据和 p 值 我已阅读 SO 上的所有其他页面 R 按组进行的夏皮罗测试不会产生 p 值和损坏的数据框警告 https stackoverflow
  • 除了第一个之外,所有意图都收到了错误的附加内容

    我有一个小应用程序 可用于设置未来事件的提醒 该应用程序使用 AlarmManager 来设置提醒用户的时间 当闹钟响起时 BroadcastReceiver 会对此进行注册 然后启动一项服务 通过 Toast 和状态栏中的通知来通知用户
  • 控制进程停止后 Android Activity 重新启动

    我的应用程序正在运行 Android Gingerbread 2 3 7 自定义版本的特殊设备上运行 在某些情况下 系统将终止我的应用程序 我认为设备制造商考虑到了这些紧急情况 应立即关闭所有第三方应用程序 以便设备可以执行其主要任务 我可
  • 使用dispatch_sync作为互斥锁

    这是我需要做的 我希望dispatch sync是使用GCD实现这一点的最佳方法 我有一段关键部分代码放置在 Appdelegate 的 applicationDidBecomeActive 回调中 我将该方法包装在dispatch syn
  • 将scala生成的数据写入文本文件

    我希望有人可以提供帮助 我是 scala 新手 并且在将输出写入文本文件时遇到一些问题 我有一个数据表 并且编写了一些代码来一次读取一行 执行我想要它执行的操作 现在我需要它将该行写入文本文件 例如 我有下表的数据类型 名称 日期 goX
  • 为什么 Scala 在第一种情况下警告类型擦除而不是第二种情况?

    我有两个函数 这些函数自原始以来没有被编辑过 下面的一些答案是对返回 序列的原始函数的响应 def foo1 A ls Iterable A Iterator A for List a b lt ls sliding 2 yield a d