scala стойността toInt не е член на Any

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 е карта, както следва,

  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) = {
}

person user644745    schedule 16.07.2013    source източник
comment
Моля, дайте пълен пример, особено типа e.   -  person Beryllium    schedule 16.07.2013


Отговори (3)


редактиране:

Добре, с новата информация бих ви предложил да създадете клас case, който съдържа данните, вместо да използвате Map, по този начин ще запазите информацията за типа. Знам, че е обичайно да се използват хешове/карти за това в динамично въведени езици, но в статично въведени езици, тъй като scala типовете данни са предпочитаният начин.

оригин:

Тъй като нито знам какво е e, нито какъв подпис има top10Tweets, мога само да предполагам. Но от вашия код и грешката предполагам, че e е Map[String, String] и вие се опитвате да получите низовото представяне на цяло число за ключа "retweets" и да го преобразувате в 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 преди това, ако съществува:

e.get("retweets").map(_.toInt).getOrElse(0)

Във всеки случай малко повече информация ще помогне да се даде точен отговор.

person drexin    schedule 16.07.2013
comment
Благодаря. Опитах, e.get(retweets).map(_.toInt).getOrElse(0), но все пак получавам стойност toInt не е член на Any... Дали защото e е Map(String, Any) ? Актуализирах въпроса със съответния код. - person user644745; 16.07.2013
comment
Здравей Drexin, благодаря. Бихте ли ми дали пример за това как да използвам case class вместо Map? - person user644745; 16.07.2013
comment
Това са доста основни неща, така че ви предлагам да прочетете добра книга за scala, за да научите основите. Програмирането в Scala от Мартин Одерски (създателят на scala) е безплатно достъпно онлайн. - person drexin; 16.07.2013

Да, защото в Map е "string" -> "string" и Вие го направихте, когато getOrElse ( else ) string -> int, затова е Any.

Map("x" -> 2).getOrElse("x", 4).toInt

работи добре или можете:

Map("x" -> "2").getOrElse("x", "4").toInt
person daaatz    schedule 16.07.2013
comment
В първия пример toInt е излишно. Върнатата стойност вече е Int. - person Randall Schulz; 16.07.2013

Същият проблем ме притеснява, преди да можете да проверите по-долу

Map("x" -> 2).getOrElse[Int](x, 4)
person Y.fei    schedule 21.12.2018