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

Scala Set.contains不会给出预期的类型不匹配错误

发布时间:2020-12-16 19:18:11 所属栏目:安全 来源:网络整理
导读:我是 Scala的新手,我很难理解为什么我在向Set.contains提供错误的参数时有时不会出现类型错误 这是使用REPL(2.9.1.final)的快速示例: scala val baz = Map("one" - 1,"two" - 2)baz: scala.collection.immutable.Map[java.lang.String,Int] = Map(one - 1,t
我是 Scala的新手,我很难理解为什么我在向Set.contains提供错误的参数时有时不会出现类型错误

这是使用REPL(2.9.1.final)的快速示例:

scala> val baz = Map("one" -> 1,"two" -> 2)
baz: scala.collection.immutable.Map[java.lang.String,Int] = Map(one -> 1,two -> 2)

scala> baz.values.toSet.contains("asdf")
res3: Boolean = false

为什么我没有在那里出现类型不匹配?

如果我将baz.values.toSet分配给另一个val,并在其上调用contains,我会进行类型检查:

scala> val bling = baz.values.toSet
bling: scala.collection.immutable.Set[Int] = Set(1,2)

scala> bling.contains("asdf")
<console>:10: error: type mismatch;
 found   : java.lang.String("asdf")
 required: Int
              bling.contains("asdf")
                             ^

愚蠢的错误,语言微妙或编译器错误?

解决方法

好的,所以Set在其类型参数中是不变的,它的工作原理与它应该完全一样

scala> Set(1,2,3) contains "Hi"
<console>:8: error: type mismatch;
 found   : java.lang.String("Hi")
 required: Int
              Set(1,3) contains "Hi"
                                    ^

但是,就像你说的那样:

scala> Map('a -> 1,'b -> 2,'c -> 3).values.toSet contains "Hi"
res1: Boolean = false

我们可以合理得出的唯一结论是所讨论的Set的类型不是Set [Int].如果我们明确告诉scala我们想要一个Set [Int]会发生什么?具有显式类型参数的同一段代码工作得很好(即它不能编译):

scala> Map('a -> 1,'c -> 3).values.toSet[Int] contains "Hi"
<console>:8: error: type mismatch;
 found   : java.lang.String("Hi")
 required: Int
              Map('a -> 1,'c -> 3).values.toSet[Int] contains "Hi"
                                                                        ^

问题是传递给toSet方法的推断类型参数. Scala显然将包含“Hi”考虑在内并推断出Int和String的润滑(即Any)

(编辑:李大同)

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

    推荐文章
      热点阅读