他にも良い回答があります。私がやったと思った別の方法は暗黙のオブジェクトを使うことでした。 、コンパイラの制約がImplicitType
コンパニオンオブジェクト内の暗黙オブジェクトを利用できるからであるため、
sealed trait ImplicitType[T]
object ImplicitType{
implicit object IntType extends ImplicitType[Int]
implicit object StringType extends ImplicitType[String]
implicit object LongType extends ImplicitType[Long]
implicit object DoubleType extends ImplicitType[Double]
}
def toDouble[T : ImplicitType](n: T) : Option[Double] = {
Try(n.toString.toDouble).toOption
}
上記作品:あなたの上記の例では、あなたのような何かを書くことができます。コンテキスト境界暗黙のdef f:ImplicitType [T]は、デフォルトでコンパニオンオブジェクト内の暗黙オブジェクトをImplicitType
で検索します。あなたのtoDouble
機能は全く変わりません。このように
val foo = toDouble(1) // Some(1.0)
val foo1 = toDouble("2") //Some(2.0)
val foo2 = toDouble(1L) //Some(1.0)
val foo3 = toDouble("s") //None
val foo4 = toDouble(1.23456e300d) //Some(1.23456E300)
:だから今のようなことを行うことができます。私はtoString
を避ける方法を考えることができませんでした。これはあなたのために働くことを望みます。
http://www.scala-lang.org/api/current/scala/math/Numeric.htmlを見てください。 – cchantep
他のタイプ(特にString)には、.toDoubleメソッドもあります。 – user451151
@ user451151 StringにはtoDoubleはありません。このメソッドは、コンパイル時にのみ解決できる暗黙的に提供されます。コンパイル時のタイプがなければ、リフレクションを使う必要があります。 – puhlen