Как мне передать это в Int, а не Some(Int)
val a: Option[Any] = Some(1)
Я пробовал toInt
и дал ошибку value toInt is not a member of Option[Any]
Как мне передать это в Int, а не Some(Int)
val a: Option[Any] = Some(1)
Я пробовал toInt
и дал ошибку value toInt is not a member of Option[Any]
Вы можете сделать a.get.asInstanceOf[Int]
, но это небезопасно. Лучше всего было бы сохранить информацию типа, то есть использовать Option[Int]
вместо Option[Any]
. Тогда вам не нужно будет выводить результат с помощью asInstanceOf
.
val a:Option[Int] = Some(1)
val i = a.get
Использование get
напрямую небезопасно, поскольку, если Option
является None
, генерируется исключение. Поэтому использование getOrElse
безопаснее. Или вы можете использовать сопоставление образцов на a
, чтобы получить значение.
val a:Option[Any] = Some(1) // Note using Any here
val i = (a match {
case Some(x:Int) => x // this extracts the value in a as an Int
case _ => Int.MinValue
})
Использование метода .asInstanceOf
a.getOrElse(0).asInstanceOf[Int]
Я должен отметить, что это небезопасный листинг: если ваш параметр содержит не Int, вы получите исключение во время выполнения.
Причина, по которой вы не можете ее использовать, заключается в том, что вы не должны бросать. В то время как статические типизированные языки программирования позволяют вручную отбрасывать между одним типом и другим, лучшее предложение, которое я могу вам дать, - это забыть об этих функциях.
В частности, если вы хотите получить максимальную отдачу от каждого языка программирования, попробуйте сделать правильный пользователь, и если язык не подходит для использования, вы просто хотите выбрать другой (например, динамически типизированный):
Если вы делаете броски, вы включаете потенциальную ошибку времени компиляции, которую мы например, потому что это легко решить, в ClassCastException, которое мы не нравится, потому что это происходит во время выполнения. Если вам нужно использовать броски в Scala, скорее всего, вы используете неправильный шаблон.