scala值toInt不是Any的成员

时间:2013-07-16 10:19:08

标签: scala types casting option

以下代码中的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) = {
}

3 个答案:

答案 0 :(得分:7)

修改

好的,我建议您使用新信息创建一个包含数据的案例类,而不是使用Map,这样您就可以保留类型信息。我知道在动态类型语言中使用哈希/映射很常见,但在静态类型语言中,因为scala数据类型是首选方式。

<强>原稿

由于我既不知道e是什么,也不知道签名top10Tweets有什么,我只能假设。但是从您的代码和错误中我假设eMap[String, String]并且您正在尝试获取键"retweets"的整数的字符串表示形式并将其转换为{{1} }}。作为默认值,您传递Int,因此类型推断器会推断类型Int,因为这是最常见的超级类型AnyString。但是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)