Scalaのジェネリック型でのパターンマッチング 質問する

Scalaのジェネリック型でのパターンマッチング 質問する

次のような Scala 関数があります:

ここで、 T の型に応じて (私の場合は、DoubleBoolean) LocalDate、 に関数を適用する必要があります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 プロパティを考慮すると、リフレクションを何らかの方法で使用して作業を完了できますか? それは可能ですか?

ベストアンサー1

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 の使用例をより良く書くかもしれません。

おすすめ記事