Cast Option[Any] to int

后端 未结 3 573
小蘑菇
小蘑菇 2021-01-03 19:37

How do I cast this to an Int and not Some(Int)

val a: Option[Any] = Some(1)

I tried toInt and it gave an error

相关标签:
3条回答
  • 2021-01-03 19:50

    The reason why you can't cast it is because you are not supposed to cast. While static typed programming languages allows you to manually cast between one type and the other, the best suggestion I can give you is to forget about this features.

    In particularly, if you want to get the best out of each programming language, try to make a proper user, and if a language does not fit the usage you want just choose another one (such as a dynamically typed one):

    If you make casts you turn a potential compile time error, which we like because it's easy to solve, into a ClassCastException, which we don't like because it occurs at runtime. If you need to use casts in Scala, very likely you are using an improper pattern.

    0 讨论(0)
  • 2021-01-03 19:55

    You could do a.get.asInstanceOf[Int] however it is unsafe. A better way would be to retain the type information i.e. using a Option[Int] instead of an Option[Any]. Then you would not need to cast the result with asInstanceOf.

    val a:Option[Int] = Some(1)
    val i = a.get
    

    Using get directly is unsafe since if the Option is a None an exception is thrown. So using getOrElse is safer. Or you could use pattern matching on a to get the value.

    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
    })
    
    0 讨论(0)
  • 2021-01-03 20:05

    Using .asInstanceOf method

    a.getOrElse(0).asInstanceOf[Int]
    

    I have to note that this is unsafe cast: if your Option contains not Int, you'll get runtime exception.

    0 讨论(0)
提交回复
热议问题