web-dev-qa-db-ja.com

Scalaのジェネリック型のパターンマッチング

私はscala次のような関数を持っています:

ここで、Tのタイプ(私の場合はDoubleBooleanLocalDate)に応じて、obに関数を適用する必要があります。 。このようなもの(コードが意味をなさないことはわかっていますが、私がやろうとしていることを伝えようとしています):

def X[T](ob: Observable[T]): Observable[T] = {
    //code  
    T match {
    case Double => DoSomething1(ob:Observable[Double]):Observable[Double]
    case Boolean => DoSomething2(ob:Observable[Boolean]):Observable[Boolean]
    case LocalDate => DoSomething3(ob:Observable[LocalDate]):Observable[LocalDate]
    }
}

ScalaのErasureプロパティを考慮に入れると、リフレクションを使用して作業を完了することができますか?それも可能ですか?

20
Core_Dumped

2.10以降を使用している場合は、TypeTagを使用します

import reflect.runtime.universe._

class Observable[Foo]

def X[T: TypeTag](ob: Observable[T]) = ob match {
    case x if typeOf[T] <:< typeOf[Double]   => println("Double obs")
    case x if typeOf[T] <:< typeOf[Boolean]  => println("Boolean obs")
    case x if typeOf[T] <:< typeOf[Int]      => println("Int obs")
}

X(new Observable[Int])
// Int obs

も参照してください この長いが素晴らしい答え

また、私はscalaリフレクションを垣間見ただけなので、誰かがTypeTagの使用法のより良い例を書くかもしれないことにも注意してください。

23
om-nom-nom