1

次のように機能する function を記述する必要があるとconvert[T]: String => Option[T]します。

 import scala.util.Try

 def toInt(s: String): Option[Int] = Try(s.toInt).toOption
 def toDouble(s: String): Option[Double] = Try(s.toDouble).toOption
 def toBoolean(s: String): Option[Boolean] = Try(s.toBoolean).toOption

 // if T is either Int, Double, or Boolean return 
 // toInt(s), toDouble(s), toBoolean(s) respectively

 def convert[T](s: String): Option[T] = ???

TypeTagそれを実装するために使用する必要がありますか?

4

1 に答える 1

4

いいえ、typeclass パターンを使用する必要があります。そうすれば、型は実行時ではなくコンパイル時に解決されるため、はるかに安全です。

trait ConverterFor[T] {
  def convert(s: String): Option[T]
}
object ConverterFor {
  implicit def forInt = new ConverterFor[Int] {
    def convert(s: String) = Try(s.toInt).toOption }
  implicit def forDouble = ...
}

def convert[T](s: String)(implicit converter: ConverterFor[T]): Option[T] =
  converter.convert(s)

正しいものConvertorForは、コンパイル時に暗黙的に解決されます。convert利用可能な暗黙的な型がない型で呼び出そうとするとConverterFor、コンパイルに失敗します。

于 2015-03-30T09:55:13.957 に答える