Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala Set.contains不';无法给出预期的类型不匹配错误_Scala_Type Conversion - Fatal编程技术网

Scala Set.contains不';无法给出预期的类型不匹配错误

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

我是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)

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"
                                                                        ^