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) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- 有人可以在2011年Scala Days上的Odersky主题演讲中分享干净
- angularjs – 为期望呼叫分配失败消息
- angularjs – “base href”使用ui-router在路由URL中添加目
- 在shell脚本中使用sed命令在XML文件中添加XML元素
- scala – sbt 0.11.2如何将~copy-resources与~aux-compile结
- typescript – 检查输入控件是否在angular2中具有某种类型的
- Scala使用Java库,利用Java 8中的lambda表达式支持
- 你会如何在(惯用)scala中编写这个java代码?
- 测试Scala对象
- ^ @符号在vim中