27

これを Int ではなく Int にキャストするにはどうすればよいですかSome(Int)

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

私は試しtoIntてみましたが、エラーが発生しましたvalue toInt is not a member of Option[Any]

4

3 に答える 3

40

できますa.get.asInstanceOf[Int]が、安全ではありません。より良い方法は、型情報を保持することです。つまり、のOption[Int]代わりにを使用しOption[Any]ます。その場合、結果を でキャストする必要はありませんasInstanceOf

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

が例外である場合は例外がスローされるgetため、直接使用することは安全ではありません。したがって、使用する方が安全です。または、パターン マッチング onを使用して値を取得することもできます。OptionNonegetOrElsea

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
})
于 2012-07-30T06:10:06.070 に答える
15

使用.asInstanceOf方法

a.getOrElse(0).asInstanceOf[Int]

これは安全でないキャストであることに注意する必要があります。Option に Int が含まれていない場合、実行時例外が発生します。

于 2012-07-30T06:06:39.220 に答える
3

キャストできないのは、キャストする必要がないからです。静的型付けプログラミング言語では、ある型と別の型の間で手動でキャストできますが、私ができる最善の提案は、この機能を忘れることです。

特に、各プログラミング言語を最大限に活用したい場合は、適切なユーザーを作成するようにしてください。言語が使用法に合わない場合は、別のもの (動的に型付けされたものなど) を選択してください。

キャストを行うと、潜在的なコンパイル時エラー (解決が容易なため好ましい) が、実行時に発生するため好ましくない ClassCastException に変わります。Scala でキャストを使用する必要がある場合は、不適切なパターンを使用している可能性が非常に高くなります。

于 2012-07-30T06:53:23.500 に答える