以下代码中的println有效(带或不带 toInt )
println("retweets : ", e.getOrElse("retweets", 0).toInt)
top10Tweets(""+e.get("text").get, e.getOrElse("retweets", 0).toInt)
但是当我将它作为函数的参数传递时(如上所述),它不起作用。它说“值toInt不是Any的成员”
当我删除toInt时,它说,
type mismatch;
[error] found : Any
[error] required: Int
e是Map,如下所示,
def tweetDetails(obj: twitter4j.Status) = {
Map(
"id" -> obj.getUser().getId(),
"screenName" -> obj.getUser().getScreenName(),
"text" -> obj.getText(),
"retweets" -> obj.getRetweetCount(),
"mentions" -> obj.getUserMentionEntities().length)
}
top10Tweets的签名,
def top10Tweets(tweets: String, retweet_c: Int, mention_c: Int) = {
}
答案 0 :(得分:7)
修改强>:
好的,我建议您使用新信息创建一个包含数据的案例类,而不是使用Map
,这样您就可以保留类型信息。我知道在动态类型语言中使用哈希/映射很常见,但在静态类型语言中,因为scala数据类型是首选方式。
<强>原稿强>:
由于我既不知道e
是什么,也不知道签名top10Tweets
有什么,我只能假设。但是从您的代码和错误中我假设e
是Map[String, String]
并且您正在尝试获取键"retweets"
的整数的字符串表示形式并将其转换为{{1} }}。作为默认值,您传递Int
,因此类型推断器会推断类型Int
,因为这是最常见的超级类型Any
和String
。但是Int
没有Any
方法,因此您会收到错误。
toInt
将默认值传递为Map("x" -> "2").getOrElse("x", 4).toInt
<console>:8: error: value toInt is not a member of Any
Map("x" -> "2").getOrElse("x", 4).toInt
,或者将String
的值转换为"retweets"
之前(如果存在):
Int
无论如何,更多的信息将有助于给出准确的答案。
答案 1 :(得分:2)
是的,因为在Map中是“string” - &gt; “string”和你在getOrElse(else)字符串时做的 - &gt; int,这就是为什么它的Any。
Map("x" -> 2).getOrElse("x", 4).toInt
工作正常或你可以:
Map("x" -> "2").getOrElse("x", "4").toInt
答案 2 :(得分:0)
同样的问题困扰着我,然后你才能在下面检查
Map("x" -> 2).getOrElse[Int](x, 4)