2016-12-05 55 views
2

首先,这样的:斯卡拉强调奇怪的行为:错误:缺少参数类型扩展功能

"1 2".split(" ").toSet 

这:

Set("1", "2") 

两个评价同一件事,即

res1: scala.collection.immutable.Set[String] = Set(1, 2) 

为什么然后,当我这样做:

Set("1", "2") map (_.toInt) 

我得到预期的:

res2: scala.collection.immutable.Set[Int] = Set(1, 2) 

,但是当我这样做:

"1 2".split(" ").toSet map (_.toInt) 

我:

<console>:12: error: missing parameter type for expanded function ((x$1) => x$1.toInt) 
    "1 2".split(" ").toSet map (_.toInt) 

我检查和附加括号不解决问题。

+0

类型检查器出错了。如果你强制类型为“String”,一切都会顺利。尝试'“1 2”.split(“”).toSet [String] map(_。toInt)' –

回答

1

使用toSet时类型推断的原因,所以你需要有一个类型提示的连锁调用或拆分调用。 你可以在这里找到https://issues.scala-lang.org/browse/SI-7743细节,https://issues.scala-lang.org/browse/SI-9091

+1

对不起,但我认为这是一个类型差异的问题。 'toSet'方法定义为'def toSet [B>:A]:Set [B]'。所以,它接受所有至少是'String'的类型。超级类型的'String'没有'toInt'方法,所以没有问题。 –

+0

相当奇怪,我再说一遍,这些太表达式: ''1 2“.split(”“).toSet'和'Set(”1“,”2“)' 评估为同样的事情。 – GA1

+0

然而,如果你直接指定类型,它将起作用:“1 2”.split(“”).toSet [String] map(_.toInt) – Stan

0

的代码应该是:

"1 2".split(" ").toSet map (x: String => x.toInt) 

在这里,我明确地指定设置包含字符串。

链调用在Scala中有这个问题,编译器期望您提供参数的类型。