I次のセットアップがあります。パターンマッチングのタイプ情報の使い方は?
trait TypeA { override def toString() = "A" }
trait TypeB { override def toString() = "B" }
trait TypeC { override def toString() = "C" }
def foo[T](t: T) = println(t)
は今、私はこのような何かを行うことができます。
val valueB: Any = new TypeB {}
val typedValue = valueB match {
case t: TypeA => foo(t)
case t: TypeB => foo(t)
case t: TypeC => foo(t)
}
// prints "B"
私はこのパターンマッチングブロックを一般化したい場合は、私は単純に行うことができます。
val typedValue = valueB match {
case t => foo(t)
}
を
と動作します。しかし、私の実際のユースケースでは、それを推論する関数の引数がないので、メソッドを呼び出すときに型情報を明示的に記述する必要があります。したがってfoo()
が型パラメータT
でパラメータ化された一般的なメソッドであるが、その型の実際のパラメータが推測されない場合は、これを一般的に1つのcase文(おそらくReflection APIを使用)と一致するパターンに一般化できますか?
これを一般化するにはどうすればよいですか?私はこのパターンマッチングブロックを一般化したい場合は
val typedValue = valueB match {
case t: TypeA => foo[TypeA]()
case t: TypeB => foo[TypeB]()
case t: TypeC => foo[TypeC]()
...
}
これはコンパイルするように見える: '場合、T => fooの[t.type]( ) 'それを試してみてください。 – jwvh
タフな部分は、パターンマッチングを実際のタイプを実際に抽出する方法ですか?私は 'val t:Any = ... 'と言うことができたいと思います。パターンマッチングの部分では、実際のタイプと一致します。編集された質問を参照してください(val valueBは現在Any型です)。 'valueB'が' Any'型であると宣言されていれば、残念なことにあなたの提案はうまくいかず、奇妙なメッセージもあります(不特定の値パラメータ:t.type)。 – slouc