タイプを比較することはできません(実行時にはerasureのため)。あなたは、あなたのクラスの表現に仕事ができる:
trait TraitA { }
trait TraitB { }
class ClassA extends TraitA { }
class ClassB extends TraitB { }
def myFunc[T](clazz: Class[T]) = {
if (classOf[TraitA] isAssignableFrom clazz) println("A")
else if (classOf[TraitB] isAssignableFrom clazz) println("B")
else println("?")
}
scala> myFunc(classOf[ClassA])
A
scala> myFunc(classOf[String])
?
たりすることができますクラスのインスタンス上のパターンマッチ:
は
def myFunc2[T](t: T) = t match {
case _: TraitA => println("A")
case _: TraitB => println("B")
case _ => println("?")
}
scala> myFunc2(new ClassA)
A
scala> myFunc2(Some(5))
?
ます。また、クラスを経由して文法的に目立たないように、最初のアプローチを使用することができますマニフェスト:
def myFunc3[T](implicit mf: ClassManifest[T]) = {
val clazz = mf.erasure
if (classOf[TraitA] isAssignableFrom clazz) println("A")
else if (classOf[TraitB] isAssignableFrom clazz) println("B")
else println("?")
}
scala> myFunc3[ClassA]
A
scala> myFunc3[String]
?
、あなたはまた、発送の異なる種類を選択することができるかどうかの/他のwieldy次のようになります。
あなたはからこれを使用するすべての一般的なコードは(暗黙のパラメータとしてまたは速記、
[T: ClassManifest]
のいずれかで利用可能マニフェストクラスを持っている必要がありますことを
object MyFunc {
val dispatch = Map(
classOf[TraitA] -> (() => println("A")),
classOf[TraitB] -> (() => println("B"))
)
val default =() => println("?")
def apply[T](implicit mf: ClassManifest[T]) =
dispatch.find(_._1 isAssignableFrom mf.erasure).map(_._2).getOrElse(default)()
}
scala> MyFunc[ClassA]
A
scala> MyFunc[String]
?
注意。
実際に私の場合はうまくいく2つの方法が見つかりました: 1)classOf [TraitA] isAssignableFrom clazz – codefly
+1:最初はあなたの答えとScalaの両方で迷惑になりました(「タイプが何もないので直接タイプを比較することはできません。 *比較するには "... **タイプ**があり、タイプは確かに何かです。あなたは"値*がありません "と書かれているはずです)。しかし、あなたはクラスのマニフェストについて説明しました。ほんとありがと! – rsenna
@rsenna - "何もありません"という意味は、 'T'はコンパイル時にどのように型をまっすぐに保つべきかをコンパイラに伝えるだけなので、そこには何もありません。実際には...ジェネリック型は、実行時には何もありません。それはなくなった。 (「タイプ消去」。)マニフェストは、コンパイル時の情報を実行時に提供する方法を提供します。 ( 'ClassTag'や' TypeTag'は2.10でそれを行う新しい方法ですが、古い方法はまだ動作しますが)とにかく、私のフレーズがあまり触れられていなくても、あなたは役に立ちました。 –