Scala Set.contains不';无法给出预期的类型不匹配错误
我是Scala的新手,我很难理解为什么在向Scala Set.contains不';无法给出预期的类型不匹配错误,scala,type-conversion,Scala,Type Conversion,我是Scala的新手,我很难理解为什么在向Set.contains提供错误参数时,有时不会出现类型错误 下面是一个使用REPL(2.9.1.final)的快速示例: 为什么我没有得到一个类型不匹配 如果我将baz.values.toSet分配给另一个val,并调用contains,我会进行类型检查: scala> val bling = baz.values.toSet bling: scala.collection.immutable.Set[Int] = Set(1, 2) scal
Set.contains提供错误参数时,有时不会出现类型错误
下面是一个使用REPL(2.9.1.final)的快速示例:
为什么我没有得到一个类型不匹配
如果我将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")
^
scala>val bling=baz.values.toSet
bling:scala.collection.immutable.Set[Int]=Set(1,2)
scala>bling.contains(“asdf”)
:10:错误:类型不匹配;
找到:java.lang.String(“asdf”)
必填项: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, 2, 3) contains "Hi"
^
我们可以合理得出的唯一结论是,所讨论的Set
的类型不是Set[Int]
。如果我们明确告诉scala我们想要一个集合[Int]
,会发生什么?带有显式类型参数的同一段代码工作正常(即,它不编译):
scala>Map('a->1,'b->2,'c->3).values.toSet[Int]包含“Hi”
:8:错误:类型不匹配;
找到:java.lang.String(“Hi”)
必填项:Int
映射('a->1,'b->2,'c->3).values.toSet[Int]包含“Hi”
^
问题是将推断类型参数传递给toSet
方法。Scala显然是在考虑包含“Hi”
,并推断Int
和字符串的lub(即Any
)你是说Scala是在从集合的后续使用中推断集合的类型参数应该更广泛,比如Any
?该死,让我来解释一下+1给你。进一步的解释是,当调用baz.values.toSet.contains(“asdf”)
时,它会找到满足条件[X>:Int]
的最接近的类型,并且它会找到X
是Any
,这意味着toSet
的结果是集[Any]
。因此,正如oxbow所提到的,你应该明确地说出你想要的集合是什么类型。你不应该解释一下,它是在推断set
的类型为Any
?@Daniel-这不是我刚才所做的吗?我想问题应该是:这是件好事的地方有哪些例子?简短的回答:语言微妙(子类型和类型推断)
scala> Set(1, 2, 3) contains "Hi"
<console>:8: error: type mismatch;
found : java.lang.String("Hi")
required: Int
Set(1, 2, 3) contains "Hi"
^
scala> Map('a -> 1, 'b -> 2, 'c -> 3).values.toSet contains "Hi"
res1: Boolean = false
scala> Map('a -> 1, 'b -> 2, 'c -> 3).values.toSet[Int] contains "Hi"
<console>:8: error: type mismatch;
found : java.lang.String("Hi")
required: Int
Map('a -> 1, 'b -> 2, 'c -> 3).values.toSet[Int] contains "Hi"
^