значение 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 представляет собой 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)
  }

подпись топ10твитов,

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
Привет, Дрексин, спасибо. Не могли бы вы привести пример того, как использовать case class вместо Map ? - person user644745; 16.07.2013
comment
Это довольно простые вещи, поэтому я предлагаю вам прочитать хорошую книгу о Scala, чтобы изучить основы. Программирование на Scala Мартина Одерски (создателя scala) находится в свободном доступе в Интернете. - person drexin; 16.07.2013

Да, потому что в Map это «строка» -> «строка», и вы сделали это, когда 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